6

Ioプログラミング言語には、lispのapply関数に相当するものがありますか。

たとえば、writelnをラップするメソッドがあります。

mymeth := method(
              //do some extra stuff

             writeln(call message arguments))
)

現時点では、これはリストを出力するだけであり、その内容を独自の引数であるかのように評価しません。

4

2 に答える 2

3

evalArgs を提案してくれた人に感謝します (コメントがどこにあるのかわかりません)。

とにかく、私の状況では解決しましたが、残念ながら一般的にはそうではないと思います.

私が説明することを行うことで達成できます:

writeln(call evalArgs join)

これにより、すべての引数が評価され、結果が 1 つの文字列に結合されます。

于 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 )


APPLYしたがって、これらすべてから、次のような Lisp を作成できます。

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 に答える