lisp - scheme什么时候评估报价?

标签 lisp scheme sicp

(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/

相关文章:

口齿不清 : Function prints NIL for list

java - 一种从 Clojure 中的 java.io.File.listFiles 中剥离返回值的方法

计划 - 二十一点计划 (SICP)/学习编程

recursion - 是否有可能在 Lisp 中递归生成 40,000 多个斐波那契数列?

macros - 由不是列表头部的关键字触发的方案宏

scheme - 为什么 chibi-scheme 会抛出这个错误

compilation - Racket/Scheme 语言的交叉编译

scheme - 是否可以更改DrRacket/Scheme搜索/引用库的顺序?

functional-programming - 为什么这会导致无限循环 [SICP]?

lisp - 尝试反转列表时出现段错误