Вопросы о выполнении заказа
Я пытаюсь изучить 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 ответ
Common Lisp не оценивает первый элемент выражения нормально. Это должен быть буквальный символ с именем функции или лямбда-выражение.
Если вы хотите вызвать функцию, определенную динамически, вам нужно использовать FUNCALL
функция:
(funcall (if t 'format) t "test")
Это аналогично необходимости использовать .call()
метод в рубине.
То, что вы пробовали, работало бы на некоторых других диалектах Лиспа, таких как Схема.