Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure的特殊形式'def'是否总是创建一个新的变量?_Clojure - Fatal编程技术网

Clojure的特殊形式'def'是否总是创建一个新的变量?

Clojure的特殊形式'def'是否总是创建一个新的变量?,clojure,Clojure,我知道在Clojure中,名称空间将符号映射到变量。因此,我们可以将符号x映射到一个Var(此处为默认名称空间),如下所示: user=> (def x 5) #'user/x user=> #'x #'user/x user=> (type #'x) clojure.lang.Var user=> x 5 现在如果我后来说这个 user=> (def x 3) #'user/x 我是否将符号x重新组合到一个全新的Var,或者是否更新了我在上面创建的同一

我知道在Clojure中,名称空间将符号映射到变量。因此,我们可以将符号
x
映射到一个Var(此处为默认名称空间),如下所示:

user=> (def x 5)
#'user/x
user=> #'x
#'user/x
user=> (type #'x)
clojure.lang.Var    
user=> x
5
现在如果我后来说这个

user=> (def x 3)
#'user/x
我是否将符号
x
重新组合到一个全新的Var,或者是否更新了我在上面创建的同一Var中的值?我怎么知道


我认为是后者,因为我在中读到了一句话“Clojure中只有Java字段、变量、引用和代理是可变的。”但我不确定这是否可以作为证据。

不,
def
并不总是创建一个新的
Var
。您可以使用
idential?
确认这一点:

user=> (def x 5)
#'user/x
user=> (def v #'x)
#'user/v
user=> (def x 3)
#'user/x
user=> (identical? v #'x)
true

Elogent的回答非常好,也被接受,但我刚刚找到了另一种方法来证明没有创建新的var,这可能有用:

user=> (def x 10)
#'user/x
user=> (let [y #'x] (println @y) (def x 7) (println @y))
10
7
nil

如果
def
创建了一个新的var,我们会看到10个变量被打印了两次。

你的直觉似乎在这个问题上得到了证实:好发现。。。。不过,我希望有类似Python或Ruby
id
的东西。