【问题标题】:Lisp: Evaluation of quotesLisp:报价评估
【发布时间】:2011-09-30 11:53:39
【问题描述】:

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

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

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

【问题讨论】:

标签: lisp eval interpreter evaluation quote


【解决方案1】:

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

您的第一个表单(+ 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

【讨论】:

    【解决方案2】:

    数字会自行评估,因此 (quote 1)1 相同。

    【讨论】:

    • 不是“相同”,而是“评估为”。
    • 感谢指正。实际上,在宏中,(quote 1)1 可能会产生不同的行为。
    猜你喜欢
    • 2013-05-28
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多