[Mono-dev] [Mono-list] Program Option Parsing Library
Dan Shryock
dan.shryock at gmail.com
Fri Jan 11 18:18:17 EST 2008
I wanted to give your library a try so I upgraded to mono 1.2.6, and
tried to compile the attachment using the following line:
gmcs -langversion:linq -define:TEST Options.cs
The compiler gives several errors, all seem to be related to the
implicit return types of the lambda function not being convertable to
void. Here's the first error:
Options.cs(420,48): error CS0029: Cannot implicitly convert type
`string' to `void'
Options.cs(420,48): error CS1662: Cannot convert `lambda expression'
to delegate type `System.Action<string>' because some of the return
types in the block are not implicitly convertible to the delegate
return type
Which happens on this block of code:
string a = null;
int n = 0;
Options p = new Options () {
{ "a=", (v) => a = v },
{ "n=", (int v) => n = v },
};
Should I be using a different version of the compiler or passing some
other parameters? Did I somehow not get my mono install upgraded
correctly (I used rpm -Uvh with the opensuse 10.2 x64 rpms from the
single download zip file which matches my distro)?
Any help would be greatly appreciated.
Dan
On Jan 7, 2008 11:42 AM, Jonathan Pryor <jonpryor at vt.edu> wrote:
>
> I've been doing a lot of work on monodocer, and (for some unknown
> reason) decided that the warning about the deprecation of
> Mono.GetOptions was annoying so I thought I'd come up with a
> replacement.
>
> This replacement is NOT currently intended to be stable, nor to be
> bundled with Mono itself for public use.
>
> It is also extremely crack-addled, which is why I'm liking it so much,
> and why I thought I'd share it with you.
>
> Crack-addled? How else would you describe this cunning combination of
> collection initializers and lambda delegates?
>
> bool help = false;
> int verbose = 0;
> string source = null;
>
> var p = new Options () {
> { "h|?|help", (v) => help = v != null },
> { "v|verbose", (v) => { ++verbose; } },
> { "source=", (v) => source = v },
> };
> p.Parse (new string[]{"--help", "-v", "-v", "-source=foo"})
> .ToArray ();
>
> After p.Parse().ToArray(), help=true, verbose=2, and source="foo".
>
> It is inspired by Perl's Getopt::Long library, except that all option
> processing is done via delegates (i.e. Perl `sub's) and not via by-ref
> variables (as Perl also supports).
>
> No reflection is used unless you use TypeConverter to implicitly convert
> strings to random managed types:
>
> Foo f = null;
> var p = new Options () {
> { "foo=", (Foo v) => f = v }
> };
>
> Support is currently highly limited: it only supports "bool" arguments
> (e.g. -a, -debug+, -debug-) and arguments with an optional or required
> value (e.g. --color=auto, -color=auto, /color=auto).
>
> Furthermore, it does not treat '-' options differently from '--' or '/'
> options, and thus does no do any kind of option bundling (e.g. treating
> '-lac' as equivalent to '-l -a -c').
>
> Regardless, at ~250 LOC for the associated classes (not including
> comments or tests), I think it's a reasonably concise and useful library
> for command-line option processing.
>
> Thoughts?
>
> - Jon
>
> _______________________________________________
> Mono-list maillist - Mono-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-list
>
>
More information about the Mono-devel-list
mailing list