在 Io 编程语言中,有没有相当于 lisp 的 apply 函数。
因此,例如,我有一个包装 writeln 的方法:
mymeth := method(
//do some extra stuff
writeln(call message arguments))
)
目前这只是打印列表,并没有评估它的内容,就好像它们是它自己的参数一样。
在 Io 编程语言中,有没有相当于 lisp 的 apply 函数。
因此,例如,我有一个包装 writeln 的方法:
mymeth := method(
//do some extra stuff
writeln(call message arguments))
)
目前这只是打印列表,并没有评估它的内容,就好像它们是它自己的参数一样。
感谢建议 evalArgs 的那个人(不确定您的评论去了哪里)。
无论如何,这已经解决了我的情况,尽管不幸的是我猜一般不是。
您可以通过以下方式实现我所描述的:
writeln(call evalArgs join)
这将评估所有参数,然后将结果连接到单个字符串中。
是否有等效于 lisp 的 apply 功能?
看看perform
&performWithArgList
方法。
退后一步,您可以FUNCALL
在 Io 中以几种不同的方式复制 Lisp:
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 )
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 )
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 )