Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lisp:引号的求值_Lisp_Eval_Interpreter_Evaluation_Quote - Fatal编程技术网

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短语) 您的第

下列哪个表达式具有正确的lisp语法

(+ 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
可能会产生不同的行为。