lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]

Rici Lake wrote:

On 1-Feb-06, at 6:46 PM, Chris Marrin wrote:

Ok, thanks. Here is what I am thinking about adding:

    local _check_foo = checkArgs("int, string='hello', number=3.14")
    function foo(a,b,c)

Where checkArgs() returns a function which does all the checking. This way, I can "compile" the argument checking function for efficiency.

That sounds like a good idea, although it would be a fair amount of work. However, there is no arg table in 5.1, and ... is not a table, or indeed any other first-class object. So, for example,


does not mean what you think it does. (It would apply the index 2 to the first argument of the function.)

All is not lost, however, since you can compile a check function with named arguments; after all, the prototype tells you how many arguments there will be. And instead of explicitly calling _check_foo, you could pass foo itself to checkArgs and have it return a wrapped function for you.

Interesting approach. That would change the syntax of the function from:

    _foo_check = checkArgs("int, string='hello', number=3.14")
    function foo(a,b,c)
        a,b,c = _foo_check(a,b,c)


    foo = checkArgs("int, string='hello', number=3.14",

which looks pretty good.

Personally, rather than trying to parse a prototype string, I'd go with a table of individual prototypes, something like this:

function foo(a, b, c) ... end
checked_foo = checkArgs{"int", "string:hello", "number:3.14"}(foo)

I was both trying to avoid so many quotes, which are error prone, and to match the way I will be generating these strings. Emma is a declarative system and an author will be able to do something like:

    <function name="foo" params="int, string='hello', number=3.14">
        function(a,b,c) ... end

and from this, I can generate the above form. The generated function would look something like:

        if b == nil then
            b = "hello"
            assert(type(b) == "string")
        return f(a,b,c)

Let me know if that wasn't enough of a hint :)

thanks for the help!

chris marrin              ,""$, "As a general rule,don't solve puzzles        b`    $  that open portals to Hell" ,,.
        ,.`           ,b`    ,`                            , 1$'
     ,|`             mP    ,`                              :$$'     ,mm
   ,b"              b"   ,`            ,mm      m$$    ,m         ,`P$$
  m$`             ,b`  .` ,mm        ,'|$P   ,|"1$`  ,b$P       ,`  :$1
 b$`             ,$: :,`` |$$      ,`   $$` ,|` ,$$,,`"$$     .`    :$|
b$|            _m$`,:`    :$1   ,`     ,$Pm|`    `    :$$,..;"'     |$:
P$b,      _;b$$b$1"       |$$ ,`      ,$$"             ``'          $$
 ```"```'"    `"`         `""`        ""`                          ,P`