Lisp:引号的求值
下列哪个表达式具有正确的lisp语法Lisp:引号的求值,lisp,eval,interpreter,evaluation,quote,Lisp,Eval,Interpreter,Evaluation,Quote,下列哪个表达式具有正确的lisp语法 (+ 1 (quote 1)) ==> 1 (???) (+ 1 (eval (quote 1)) ==> 2 我目前正在编写自己的lisp解释器,不太确定如何正确处理引号。我看过的大多数lisp解释器都将这两个表达式计算为“2”。但是,难道不应该对引用进行评估,从而只有第二个引用才是合法的表达吗?那它为什么还能用呢?这是某种句法上的糖吗 除非使用特殊形式,否则大多数Lisp首先计算参数,然后应用函数(因此使用eval和apply短语) 您的第
(+ 1 (quote 1))
==> 1 (???)
(+ 1 (eval (quote 1))
==> 2
我目前正在编写自己的lisp解释器,不太确定如何正确处理引号。我看过的大多数lisp解释器都将这两个表达式计算为“2”。但是,难道不应该对引用进行评估,从而只有第二个引用才是合法的表达吗?那它为什么还能用呢?这是某种句法上的糖吗 除非使用特殊形式,否则大多数Lisp首先计算参数,然后应用函数(因此使用eval和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
数字对自身进行计算,因此
(引号1)
与1
相同,不是“相同”,而是“计算到”。感谢您的更正。实际上,在宏中,(引号1)
和1
可能会产生不同的行为。