3

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

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

我目前正在编写自己的 lisp 解释器,但不太确定如何正确处理引号。我看过的大多数 lisp 解释器都将这两个表达式都评估为“2”。但是不应该根本不评估报价,因此只有第二个是合法的表达吗?为什么它仍然有效?这是某种语法糖吗?

4

2 回答 2

5

除非有特殊形式,大多数 Lisps 首先评估参数,然后应用函数(因此有 eval-and-apply 短语)。

您的第一个表单(+ 1 '1)将首先评估其参数1'1. 常量数字对自己求值,而引号对它引用的内容求值,所以你只能申请+and 11yielding 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
于 2011-09-30T12:02:01.980 回答
3

数字对自己进行评估,因此(quote 1)与 相同1

于 2011-09-30T12:02:57.410 回答