Подтвердить что ты не робот

Определение формы "lisp"?

Какое именно определение формы "Lisp"

Насколько я знаю, это "либо атом, либо список, который имеет символ в качестве своего первого элемента".

Но тогда это (в Схеме) не будет формой:

((lambda () 42))  ;; The answer to Life, the Universe and Everything.

Поскольку первый элемент списка сам по себе является другим списком. И после его оценки это будет процедура (не символ).

Я могу найти несколько разных веб-сайтов и руководств о формах Lisp, но ни один из них не дает полного и подробного определения. Где я могу найти его?

4b9b3361

Ответ 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))

Это ошибка, показывающая, что она отличается от вызова процедуры.

Ответ 2

Из общий lisp словарь гиперспекалов

форма n. 1. любой объект, который должен быть оценен. 2. символ, составная форма или самооценка объекта. 3. (для оператора, как в <<operator>> form'') a compound form having that operator as its first element. Форма цитаты является постоянной формой. ''