Lisp:评价报价
问题描述:
以下哪个表达式具有正确的lisp语法?Lisp:评价报价
(+ 1 (quote 1))
==> 1 (???)
(+ 1 (eval (quote 1))
==> 2
我目前正在写我自己的lisp解释器,不太清楚如何处理正确的引号。我看过的大多数口译员都会将这两个表达式评估为“2”。但是,不应该对报价进行评估,因此只有第二个是法律表达方式吗?无论如何,它为什么会起作用?这是一种语法糖吗?
答
除特殊形式外,大多数Lisps先评估参数,然后应用函数(因此是评估和应用的短语)。
您的第一个表格(+ 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
答
号评估自己这样(quote 1)
相同1
。
+2
不是“相同”,而是“评估为”。 –
+1
感谢您的更正。事实上,在一个宏中,“(quote 1)”和“1”可能会产生不同的行为。 – Peteris
一个好的相关问题是[Lisp中1和'1有什么区别?](http://stackoverflow.com/questions/2966765/what-is-the-difference-between-1-and-1 -in-口齿不清)。 – Peteris