Вопросы о выполнении заказа

Я пытаюсь изучить 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() метод в рубине.

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

Другие вопросы по тегам