Lisp:评价报价

yea*_*iii 3 lisp evaluation interpreter eval quote

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

(+ 1 (quote 1))
==> 1 (???)
(+ 1 (eval (quote 1))
==> 2
Run Code Online (Sandbox Code Playgroud)

我目前正在编写自己的lisp解释器,并不太确定如何正确处理引号.我看过的大多数lisp解释器都将表达式计算为"2".但是,根本不应该对报价进行评估,从而只有第二个是法律表达?那么为什么它仍然适用呢?这是某种语法糖吗?

JB.*_*JB. 5

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

你的第一个表格(+ 1 '1)将首先评估其论点1'1.恒NUMERICS评价自己,而报价的计算结果为它所引用,所以你会离开应用+11,产生2.

eval: (+ 1 (quote 1))
eval 1st arg:  1 ==> 1
eval 2nd arg: '1 ==> 1
apply: (+ 1 1) ==> 2
Run Code Online (Sandbox Code Playgroud)

第二种形式是相似的,未引用的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
Run Code Online (Sandbox Code Playgroud)