On Tue, 25 Oct 2005, Trans wrote:

>
>> def meth *argv
>>     pa =
>>       parseargs(argv) do
>>         req_arg 'foo', 'bar'
>>         opt_arg 'request' => 'useless'
>>         opt_kw 'side'
>>         opt_kw 'meat' => 'fish'
>>       end
>
> I idea is good but may I suggest it be a little less "cryptic"?
> Something more like:
>
>  def meth *parm
>     parm = Parameters.new(parm) do
>       args :foo, :bar, :request => 'useless'
>       keys :side => nil, :meat => 'fish'
>     end
>     parm.foo
>     ...

how do you say that an argument is optional then?  are all keywords implied as
optional?  why should it be so?  parseargs handles both cases.  by allowing

   required_arguments
   optional_arguments

   required_keywords
   optional_keywords

and shortcuts such as

   req_arg, ra
   req_kw, kw

of course you can say

   arguments
   keywords

all of the above (and there are more) takes lists.  and these are by default
required.  eg

   def meth *argv
     pa = parseargs argv do
       arguments %w( foo bar )
       keywords %w( foobar barfoo )
     end
     ...
   end

the reason i do not allow

   arguments 'foo', 'bar' => 42

but do allow

   argument 'foo' => 42

is that the options can be used to convey much more that a default value in
parseargs.  it can be used to specify type, ducktype, coersion, default procs
instead of value only, etc.  for example

   arguments 'foo', 'bar', 'default' => 42, 'type' => Fixunm, 'ducktype' => 'to_i'

   argument 'n', 'types' => [Fixunm, Float]

   argument 'n', 'coerce' => :to_i

   argument 'n', 'coerce' => lambda{|n| Integer n}

   argument 's', 'ducktype' => %w( upcase downcase gsub )

so, basically, if you pass a __single__ argument that's a hash as in

   argument 'foo' => 42

i know 42 is the default value for foo.  if you pass more than one argument as
in

   argument 'foo', 'bar', 'default' => '42', 'corece' => 'to_s'

i can't tell if the last hash is full of paramter names and default values or
metadata like type info and coercsion info.  sure - it's obvious to the eye,
but makeing any assumptions would disallow this

   argument 'default' => 42

here default is a parameter with a default value of 42.  sticky.

you can read all about it here

   http://codeforpeople.com/lib/ruby/parseargs/parseargs-0.3.0/README

> You could also to set parm automatically, and of course a #parameters
> constructor method is fine if you prefer, producing:
>
>  def meth *parm
>     parameters(parm) do
>       args :foo, :bar, :request => 'useless'
>       keys :side => nil, :meat => 'fish'
>     end
>     parm.foo

but that cannot be done?  you cannot munge 'parm' in place and set it to
another variable?  perhaps i'm not understanding?

cheers.

-a
-- 
===============================================================================
| email :: ara [dot] t [dot] howard [at] noaa [dot] gov
| phone :: 303.497.6469
| anything that contradicts experience and logic should be abandoned.
| -- h.h. the 14th dalai lama
===============================================================================