Определение лисп-формы?

Что именно определяет «форма Лиспа»?

Насколько я знаю, это «либо атом, либо список, в котором первым элементом является символ».

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

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

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

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


person josh    schedule 20.05.2010    source источник
comment
На самом деле это допустимая форма и программа lisp. Я полагаю, что мое определение ниже будет настолько подробным, насколько вы его получите, не уверен, что я что-то забыл, но я считаю, что оно исчерпывающее.   -  person Zorf    schedule 21.05.2010
comment
В Clojure: ((fn [] 42))   -  person David Tonhofer    schedule 16.04.2019


Ответы (2)


Форма Лиспа — это данные Лиспа, которые также являются программой, то есть могут быть вычислены без ошибок.

(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
comment
Как бы вы объявили свою собственную форму if, не могли бы вы опубликовать пример синтаксиса для формы my-if? - person eliocs; 29.09.2013
comment
Боюсь, что lisp datum неправильная формулировка, так как данное в Лиспе определяется как «А-список — это список пар, машина пары называется ключом, а cdr называется данным» из p431 Common Lisp 2-е издание. - person prosseek; 21.10.2015
comment
Недурно за явную ссылку на определенные типы форм - person dat; 03.09.2017
comment
Можно возразить, что if - это не синтаксис, а функция, которая требует, чтобы интерпретатор выполнил ленивую оценку один раз (в то время как это обычно не делается по соображениям производительности и простоты, а также по причинам детерминизма, особенно для побочных эффектов). Но давайте оставаться практичными. - person David Tonhofer; 16.04.2019
comment
Есть ли разница между «формой» и «выражением»? Я имею в виду, что все формы имеют значения, даже если они равны нулю, верно? - person oskarkv; 19.11.2019

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

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

person Pete Kirkham    schedule 20.05.2010