(car ''abracadabra)
相当于(car (quote (quote abracadabra))
, 它的计算结果为 (car (quote abracadabra))
--> quote
另一方面(car (quote (a b)))
评估为 a
,这对我来说很直观。
所以我的问题是,为什么 Scheme 不计算 (car (quote (quote abracadabra))
中的第二个引号? (即评估 (car (quote abracadabra))
到 (car abracadabra)
),但评估 (car (quote (a b)))
中的报价(即为什么不是 quote
的答案)?
最佳答案
在这个表达式中:
(car (quote (quote abracadabra)))
=> 'quote
内部的 quote
不会被计算,它只是一个符号,没有特别的意义。您不妨将其更改为其他任何内容,结果相同:
(car (quote (foobar abracadabra)))
=> 'foobar
在引用的表达式中,其他表达式不会被计算。我们可以使用 quasiquoting强制评估,现在这将尝试评估内部报价,导致每种情况的不同错误:
(car (quasiquote (unquote (quote abracadabra)))) ; (car `,(quote abracadabra))
=> car: contract violation expected: pair? given: 'abracadabra
(car (quasiquote (unquote (foobar abracadabra)))) ; (car `,(foobar abracadabra))
=> foobar: unbound identifier in module in: foobar
关于lisp - scheme什么时候评估报价?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16885044/