Лисп: оценка котировок - PullRequest
       27

Лисп: оценка котировок

3 голосов
/ 30 сентября 2011

Какое из следующих выражений имеет правильный синтаксис lisp?

(+ 1 (quote 1))
==> 1 (???)
(+ 1 (eval (quote 1))
==> 2

В настоящее время я пишу свой собственный интерпретатор lisp и не совсем уверен, как правильно обрабатывать кавычки.Большинство интерпретаторов lisp, на которые я смотрел, оценивают оба выражения как «2».Но не должна ли цитата вообще не оцениваться и, следовательно, только вторая является юридическим выражением?Почему тогда это работает?Это какой-то синтаксический сахар?

Ответы [ 2 ]

5 голосов
/ 30 сентября 2011

За исключением специальных форм, большинство Лиспов сначала оценивают аргументы, затем применяют функцию (отсюда и фразу eval-and-apply).

Ваша первая форма (+ 1 '1) сначала оценивает свои аргументы 1 и'1.Постоянные числовые значения оцениваются сами по себе, а кавычка оценивается по отношению к тому, что она цитирует, так что вам осталось бы применить + к 1 и 1, получив 2.

eval: (+ 1 (quote 1))
eval 1st arg:  1 ==> 1
eval 2nd arg: '1 ==> 1
apply: (+ 1 1) ==> 2

Второйформа аналогична, без кавычек 1 будет проходить через eval один раз, снова давая 1:

eval: (+ 1 (eval '1))
eval 1st arg: 1 ==> 1
eval 2nd arg: (eval '1)
  eval arg:    '1 ==> 1
  apply: (eval 1) ==> 1
apply: (+ 1 1) ==> 2
3 голосов
/ 30 сентября 2011

Числа оцениваются сами по себе, поэтому (quote 1) совпадает с 1.

...