Форма Лиспа — это данные Лиспа, которые также являются программой, то есть могут быть вычислены без ошибок.
(3 4 1)
Это шепелявые данные, это список из 3, 4 и 1. Однако это не форма, поскольку попытка ее оценки не приводит к другим данным. А скорее ошибка.
3
Это данные и форма, также называемая «нормальной формой» или «самооценивающими данными», она оценивает сама себя.
(+ 3 4 1)
Является составной формой, вычисление приводит к нормальной форме 8
.
Помимо обычных форм и составных форм, составные формы можно подразделить на вызовы процедур и специальные формы (также называемые синтаксисом), но, более правильно, заголовком специальной формы является синтаксис, например:
(if (oddp 2) (print "me") (print "or me"))
Это особая форма, потому что ее заголовком является синтаксис, а не процедура, единственное различие между вызовами процедур и специальными формами заключается в том, что вызовы процедур видят все аргументы формы как формы сами по себе и пытаются сначала оценить его, и специальные формы не обязательно это делают. Как мы понимаем, оцениваются только второй и четвертый член этой составной формы, первый член является синтаксисом, а третий в данном случае отбрасывается. Как мы знаем, например:
((a 1) (b 2))
Не является формой в Common Lisp, она может быть допустимой формой в Scheme, но только если форма (a 1)
оценивается как данные процедуры. Так:
(let ((a 1) (b 2)) (+ a b))
Является специальной формой, она не оценивает свой второй член и оценивает свой третий член иначе, чем можно было бы ожидать, если бы это не была специальная форма. То есть a и b как подформы его третьей формы имеют разную привязку. let
в данном случае является синтаксическим ключевым словом, обозначающим особую форму.
Обратите внимание, что вполне возможно, что специальные формы по-прежнему оценивают все свои аргументы, тогда они по-прежнему не являются вызовами процедур, потому что их заголовком является синтаксис, а процедуры могут быть переданы другим функциям в качестве аргументов, синтаксис не может, таким образом:
(func arg1 #'let)
Тоже ошибка:
(funcall let ((a 1) (b 2)) (+ a b))
Ошибка, показывающая, что это отличается от вызова процедуры.
person
Zorf
schedule
20.05.2010
((fn [] 42))
- person David Tonhofer   schedule 16.04.2019