Определение понятия "лисп"? - PullRequest
27 голосов
/ 20 мая 2010

Какое именно определение "формы Лиспа"?

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

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

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

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

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

Ответы [ 2 ]

47 голосов
/ 21 мая 2010

Форма 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))

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

14 голосов
/ 21 мая 2010

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

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

...