【发布时间】:2011-05-21 05:28:53
【问题描述】:
Clojure 中的 var 和 quote 有什么区别?例如,(var a) 和 (quote a)。
官方网站有以下文档,但是var对象和符号的值有什么区别?我很困惑。
(变量符号) 符号必须解析为 var,并返回 Var 对象本身(而不是其值)
【问题讨论】:
-
考虑添加
quote的定义。这应该是有道理的。
标签: clojure
Clojure 中的 var 和 quote 有什么区别?例如,(var a) 和 (quote a)。
官方网站有以下文档,但是var对象和符号的值有什么区别?我很困惑。
(变量符号) 符号必须解析为 var,并返回 Var 对象本身(而不是其值)
【问题讨论】:
quote 的定义。这应该是有道理的。
标签: clojure
(quote a) 返回一个符号 (clojure.lang.Symbol) - 它的作用与 'a 相同。值得阅读更多关于Clojure reader 的信息,以了解更多关于符号的信息。示例:
(quote a)
=> a
(var a) 返回当前命名空间中符号 a 表示的 var (clojure.lang.Var)。如果 a 未在当前命名空间中定义,您将收到错误消息。示例:
(var a)
=> #<CompilerException java.lang.RuntimeException: Unable to resolve var: a in this context, compiling:(NO_SOURCE_PATH:1)>
(def a 1)
(var a)
=> #'user/a
这是技术定义 - 但这是其背后的直觉:符号是名称,可用于在给定名称空间中查找 var。 var 本身是一种引用,可以保存任何类型的 Clojure 值。所以一个符号标识一个包含一个值的变量。
【讨论】:
考虑一下:
; #'x a reader short-cut for (var x), and 'x is a short-cut for (quote x)
(def x)
(binding [x 1] (var-set #'x 2) (list (var x) (quote x) x))
计算结果类似于(添加了 cmets)
(
#'sandbox177857/x ; the variable itself - was passed to var-set
x ; the symbol x. same as 'x
2 ; last value in #'x
)
set! 将接受(除其他外)一个 Var 或解析为全局名称的符号(var-set 将只接受一个 Var)。 (var-set x ...) 不起作用的原因是这会导致传入 x 的值(而不是名为 x 的 Var)。
希望这会有所帮助。编码愉快。
【讨论】:
x = x + 1; 第一个 x 是一个左值并且未计算。因此 Clojure 中的 Var 可以更强大,因为它们本身可以作为值传递; C 需要指针乐趣。此外,由于 Var 在作用域中与名称分离,它可以通过不同的词法作用域传递,这些词法作用域可能有自己的“x”变量——但 Var 始终是它自己。