On 11.06.2010 20:06, Jos Backus wrote:
> On Fri, Jun 11, 2010 at 03:25:06PM +0900, Robert Klemme wrote:
>> Drop your requirement.  Think about it: what you require is extremely
>> hard to do.  How do you expect the option parsing to work reliably in
>> light of ambiguity?  If for example -e is also a valid option then what
>> do you make of this?  Since you likely also want to recognize -h you
>> have the ambiguity built in right from the start.
>
> Well, while I agree with you, my colleagues will claim that Perl's
> Getopt::Long pulls it off :)

Several thoughts come to mind.  First of all, even Perl cannot remove 
the ambiguity - their implementation will simply automatically favor one 
interpretation over another.  For me personally Perl is not a role model 
for what we should do in Ruby land.  Perl has it's merits but my 
preference is clearly on a clean object model and clean syntax - even if 
Ruby is slower in some benchmarks.

Btw, could be that even POSIX mandates double dashes for long options.

Guideline 5:
     Options without option-arguments should be accepted when grouped 
behind one '-' delimiter.

http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html

This _can_ be read as exclusion of a single word option behind a single 
dash.  But then again POSIX does not say anything about long option names.

>> Alternatively, you could preprocess the arguments and look for "-help"
>> yourself e.g.
>>
>> ARGV.map! {|arg| '-help' == arg ? '--help' : arg}
>
> Yeah, but you'd have to do that for all the long option words.
>
> I wonder, is there an easy way to get the list of long option names from
> optparse? If there was, you could do the above replacement only on those
> elements of ARGV that are a long option, and keep bundled arguments such as
> `-Dfoo=bar' working as it wouldn't match any of the long option names.
>
> Any ideas?

Yes, you can use #instance_variable_get to access internal structures of 
OptionParser.  If you want to find out about internals you can either 
try documentation or investigate with IRB, e.g. http://pastie.org/1001813

You might be able to get the long option via  x.long.keys where x is an 
instance of OptionParser::List or analyzing OptionParser::Switch and 
reading #long (see the output in pastie for navigation).

Kind regards

	robert

-- 
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/