Lisp:评价报价

问题描述:

以下哪个表达式具有正确的lisp语法?Lisp:评价报价

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

我目前正在写我自己的lisp解释器,不太清楚如何处理正确的引号。我看过的大多数口译员都会将这两个表达式评估为“2”。但是,不应该对报价进行评估,因此只有第二个是法律表达方式吗?无论如何,它为什么会起作用?这是一种语法糖吗?

+2

一个好的相关问题是[Lisp中1和'1有什么区别?](http://stackoverflow.com/questions/2966765/what-is-the-difference-between-1-and-1 -in-口齿不清)。 – Peteris

除特殊形式外,大多数Lisps先评估参数,然后应用函数(因此是评估和应用的短语)。

您的第一个表格(+ 1 '1)将首先评估其参数1'1。常数数值评估自己,并且报价评估为它引用的内容,所以你应该使用+11,产生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