Ответ 1
A lisp form - это тег lisp, который также является программой, т.е. может быть оценен без ошибок.
(3 4 1)
Является ссылкой lisp, это список из 3, 4 и 1. Это не форма, но попытка оценить ее не приводит к другой дате. Но скорее ошибка.
3
Является базой данных и формой, также называемой "нормальной формой" или "самооценивающейся базой данных", она оценивает себя.
(+ 3 4 1)
Является ли составная форма, оценивая ее, приводит к нормальной форме 8
.
Помимо нормальных форм и составных форм, составные формы могут быть подразделены на вызовы процедур и специальные формы (также называемые синтаксисом), но более правильно, главой специальной формы является синтаксис, как в:
(if (oddp 2) (print "me") (print "or me"))
Это специальная форма, потому что голова является синтаксисом, а не процедурой, единственная разница между вызовами процедур и специальными формами заключается в том, что вызовы процедур видят все аргументы формы как формы сами по себе и пытаются сначала ее оценить и специальные формы не обязательно это делают. Как мы понимаем, оценивается только второй и четвертый члены этой составной формы, первый член является синтаксисом, а третий отбрасывается в этом случае. Как известно, например:
((a 1) (b 2))
Не является формой в Common Lisp, она может быть допустимой формой в Схеме, но только если форма (a 1)
оценивается в качестве элемента процедуры. Итак:
(let ((a 1) (b 2)) (+ a b))
Является специальной формой, она не оценивает ее второй член и оценивает ее третий член по-другому, чем то, что ожидалось бы, если бы оно не было специальной формой. То есть, а и b, поскольку подформы его третьей формы имеют другую привязку. let
в этом случае является синтаксическим ключевым словом, которое сигнализирует специальную форму.
Обратите внимание, что вполне возможно, что специальные формы по-прежнему оценивают все свои аргументы, но они по-прежнему не являются процедурами, потому что их голова является синтаксисом, а процедуры могут передаваться другим функциям в качестве аргументов, синтаксис не может, таким образом:
(func arg1 #'let)
Это ошибка, также:
(funcall let ((a 1) (b 2)) (+ a b))
Это ошибка, показывающая, что она отличается от вызова процедуры.