Clojure中var和quote之间有什么区别?例如,(var a)
和(quote a)
。
官方网站有以下文件,但var对象和符号的值有什么区别?我很困惑。
(var符号) 符号必须解析为var,并返回Var对象本身(而不是其值)
答案 0 :(得分:17)
(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值的引用。因此,符号标识包含值的var。
答案 1 :(得分:4)
考虑一下:
; #'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))
评估为(评论已添加)
(
#'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)。
希望这有帮助。快乐的编码。