var和quote有什么区别?

时间:2011-05-21 05:28:54

标签: clojure

Clojure中var和quote之间有什么区别?例如,(var a)(quote a)

官方网站有以下文件,但var对象和符号的值有什么区别?我很困惑。

(var符号) 符号必须解析为var,并返回Var对象本身(而不是其值)

2 个答案:

答案 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)。

希望这有帮助。快乐的编码。