Вопросы о выполнении заказа - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь выучить Common Lisp, и обнаружил что-то неожиданное (для меня), когда что-то пробовал в реплее. Основываясь на порядке выполнения в большинстве языков программирования и отличной поддержке функций первого класса, о которой я всегда слышал от lisp, я думаю, что должно сработать следующее:

((if t 'format) t "test")

В Ruby я могу сделать:

if true
  Object.method(:puts)
end.call("test")

Я думаю о том, как должен работать приведенный выше код lisp, что он должен оценить внутреннюю форму lisp, вернуть формат, а затем начать оценивать внешнюю форму lisp, тогда как format будет первым атомом. Я читал, что первая форма должна быть символом, поэтому я также попытался ((if t format) t "test"), хотя изначально я думал, что он попытается оценить формат, прежде чем вернуться из внутренней формы.

Я заметил, что иногда формы lisp должны предшествовать #', чтобы их результаты могли быть вызваны, но использование (#'(if t 'format) t "test") также не работает. Я уверен, что просто неправильно понимаю что-то базовое, потому что я довольно новичок в этом, но что здесь происходит?

1 Ответ

0 голосов
/ 30 июня 2018

Common Lisp не оценивает первый элемент выражения нормально. Это должен быть буквальный символ с именем функции или лямбда-выражение.

Если вы хотите вызвать функцию, определенную динамически, вам нужно использовать функцию FUNCALL:

(funcall (if t 'format) t "test")

Это аналогично необходимости использовать метод .call() в Ruby.

То, что вы пробовали, работало бы на некоторых других диалектах Лиспа, таких как Схема.

...