[REBOL] Re: How to check function arguments ?
From: jason:cunliffe:verizon at: 9-Jun-2002 9:21
hmm..
Q: How to tell if a word already exists or if is just an argument value being
passed?
>> somefunc: func [inp [any-type!]][if value? 'inp [print inp "do stuff"]]
>> somefunc
== none
>> somefunc "hello"
hello
== "do stuff"
>> somefunc print now
9-Jun-2002/8:32:33-4:00
== none
When the input to somefunc is something like 'print' or any word in the rebol
dictionary, we might assume that it is not a valid argument. Arguments we would
be expecting would usually be a number, a name, a time, a block, etc.. So we
could check for an existing known word, then perhaps it is not an argument. I
don't know how to do that kind of lookup and could be slow.. It seems pretty
limiting unless we are only passing in very simple strings and numbers, which in
fact we often are in cgi work.
But the obvious escape is just put all args in a block.
>> somefunc exists? %test.xml ;;; empty argument, keep going..
>> somefunc [exists? %test.xml] ;;; evaluate block and use as argument
>> somefunc [1 "love" now ] ;;; evaluate block and use as argument
>> somefunc [name "jason" email [jasonic--nomadics--org] startdir %.] ;;; name,
email are keywords arguments
Which creates Python's **Kw variable keyword arguments very nicely.
Except for a concise local way to embed default handling.
if error? try [startdir] [startdir: "%/home/jasonic"]
That works, but it's verbose next to Python.
Any idiom suggestions to improve upon it within a function?
Anyway feel like I just reinvented some primal rebol wheel here! Must be time to
study scope and context more.. I suppose I need an 'arg-block tool I can use
widely.
Can anyone point me to examples using blocks as arguments, and techniques for
parsing them?
thanks
./Jason