Clojure var和quote之间有什么区别?

Clojure var和quote之间有什么区别?,clojure,Clojure,在Clojure中var和quote的含义有什么区别?例如,var a和quote a 官方网站有以下文件,但是var对象和符号的值有什么区别?我很困惑 变量符号 符号必须解析为var,并且返回的是var对象本身,而不是它的值 ; #'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)

在Clojure中var和quote的含义有什么区别?例如,var a和quote a

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

变量符号 符号必须解析为var,并且返回的是var对象本身,而不是它的值

; #'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
)
设定!将接受一个变量或一个解析为全局名称的符号,变量集只接受一个变量。。。不可能的是,这会导致传入x的值,而不是名为x的Var

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

引用a返回一个符号clojure.lang.symbol-它有效地执行与“a”相同的操作。值得多读一点关于符号的知识,以了解更多关于符号的知识。例如:

(quote a)
=> 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 a返回当前名称空间中由符号a表示的var clojure.lang.var。如果未在当前名称空间中定义,则会出现错误。例如:

(quote a)
=> 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本身是一种引用,可以保存任何类型的Clojure值。因此,符号标识包含值的var。

也考虑在quote的定义中添加。这应该是有道理的。谢谢你的回答。似乎Var对象是符号名和它的值之间的直接层,对吗?@Thomson这是一种谈论具有给定名称的变量的方式。在C中,这是不需要的:x=x+1;第一个x为l值,未计算。因此,Clojure中的变量可以更强大,因为它们本身可以作为值传递;C需要指针的乐趣。此外,由于变量与作用域中的名称是分开的,因此可以通过不同的词法作用域进行传递,这些词法作用域可能有自己的x变量,但变量始终是自己的。此外,我无法直接运行示例程序来检查结果。我得到了CompilerException系统。异常:无法在此上下文中解析var:x。但是如果我在示例之前添加def x 3,它也会生成异常。@pst,谢谢。你修好了吗?我仍然无法通过简单的复制和粘贴来运行它。仍然获得InvalidOperationException无法动态绑定非动态变量:user/x@Thomson:右,变量是一个间接层。它是一种管理状态的结构,引用、代理和原子也是如此。因此,var是一个可以设置值的框。vars的与众不同的特性是能够使用clojure在每个线程的基础上动态绑定新值