Ио язык «применять аргументы» - PullRequest
5 голосов
/ 12 декабря 2010

На языке программирования Io есть ли эквивалент функции применения lisp.

Так, например, у меня есть метод обернуть writeln:

mymeth := method(
              //do some extra stuff

             writeln(call message arguments))
)

На данный момент это просто печатаетсписок, и не оценивает его содержимое, как если бы они были его собственными аргументами.

Ответы [ 2 ]

3 голосов
/ 12 декабря 2010

Спасибо тому человеку, который предложил evalArgs (не уверен, куда направился ваш комментарий).

В любом случае, это разрешило мою ситуацию, хотя, к сожалению, не в общем, я думаю.

Вы можете достичьчто я описываю, делая:

writeln(call evalArgs join)

Это вычисляет все аргументы, а затем объединяет результаты в одну строку.

2 голосов
/ 02 июня 2011

есть ли эквивалент функции применения lisp?

Посмотрите на perform & performWithArgList методы.


Чтобы сделать шаг назад, вы можете повторить Lisp FUNCALL несколькими способами в Io:

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