以下哪个表达式具有正确的 lisp 语法?
(+ 1 (quote 1))
==> 1 (???)
(+ 1 (eval (quote 1))
==> 2
我目前正在编写自己的 lisp 解释器,但不太确定如何正确处理引号。我看过的大多数 lisp 解释器都将这两个表达式都评估为“2”。但是不应该根本不评估报价,因此只有第二个是合法的表达吗?为什么它仍然有效?这是某种语法糖吗?
以下哪个表达式具有正确的 lisp 语法?
(+ 1 (quote 1))
==> 1 (???)
(+ 1 (eval (quote 1))
==> 2
我目前正在编写自己的 lisp 解释器,但不太确定如何正确处理引号。我看过的大多数 lisp 解释器都将这两个表达式都评估为“2”。但是不应该根本不评估报价,因此只有第二个是合法的表达吗?为什么它仍然有效?这是某种语法糖吗?
除非有特殊形式,大多数 Lisps 首先评估参数,然后应用函数(因此有 eval-and-apply 短语)。
您的第一个表单(+ 1 '1)
将首先评估其参数1
和'1
. 常量数字对自己求值,而引号对它引用的内容求值,所以你只能申请+
and 1
,1
yielding 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
。