Форма LISP - это данные 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))
Это специальная форма , она не оценивает своего второго члена и оценивает своего третьего члена иначе, чем можно было бы ожидать, если бы это была не специальная форма. То есть a и b как подчиненные формы его третьей формы имеют различную привязку. let
в этом случае является синтаксическим ключевым словом, которое сигнализирует о специальной форме.
Обратите внимание, что вполне возможно, что специальные формы все еще оценивают все свои аргументы, тогда они все еще не являются вызовами процедур, потому что их заголовок является синтаксисом, а процедуры могут передаваться другим функциям как аргументы, а синтаксис - нет, таким образом:
(func arg1 #'let)
Ошибка также:
(funcall let ((a 1) (b 2)) (+ a b))
Ошибка, показывающая, что она отличается от вызова процедуры.