6

在 Io 编程语言中,有没有相当于 lisp 的 apply 函数。

因此,例如,我有一个包装 writeln 的方法:

mymeth := method(
              //do some extra stuff

             writeln(call message arguments))
)

目前这只是打印列表,并没有评估它的内容,就好像它们是它自己的参数一样。

4

2 回答 2

3

感谢建议 evalArgs 的那个人(不确定您的评论去了哪里)。

无论如何,这已经解决了我的情况,尽管不幸的是我猜一般不是。

您可以通过以下方式实现我所描述的:

writeln(call evalArgs join)

这将评估所有参数,然后将结果连接到单个字符串中。

于 2010-12-12T00:45:13.217 回答
3

是否有等效于 lisp 的 apply 功能?

看看perform&performWithArgList方法。


退后一步,您可以FUNCALL在 Io 中以几种不同的方式复制 Lisp:

1 - 传递一个函数,即。堵塞():

plotf := method (fn, min, max, step,
    for (i, min, max, step,
        fn call(i) roundDown repeat(write("*"))
        writeln
    )
)

plotf( block(n, n exp), 0, 4, 1/2 )

2 - 传递消息:

plotm := method (msg, min, max, step,
    for (i, min, max, step,
        i doMessage(msg) roundDown repeat(write("*"))
        writeln
    )
)

plotm( message(exp), 0, 4, 1/2 )

3 - 将函数名称作为字符串传递:

plots := method (str, min, max, step,
    for (i, min, max, step,
        i perform(str) roundDown repeat(write("*"))
        writeln
    )
)

plots( "exp", 0, 4, 1/2 )


因此,您可以从所有这些中创建一个 Lisp APPLY,如下所示:

apply := method (
    args := call message argsEvaluatedIn(call sender)
    fn   := args removeFirst
    performWithArgList( fn, args )
)

apply( "plotf", block(n, n exp), 0, 4, 1/2 )

apply( "plotm", message(exp), 0, 4, 1/2 )

apply( "plots", "exp", 0, 4, 1/2 )
于 2011-06-02T14:17:38.883 回答