Clojure特殊形式`def`是否总是创建一个新的Var?

时间:2016-04-10 22:52:44

标签: clojure

我知道在Clojure中,名称空间将符号映射到Vars。所以我们可以将符号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中的值?我怎么知道?

我认为它是后者,因为我读了句子"只有Java字段,Vars,Refs和Agent在Clojure中是可变的。"在Clojure Reference page on Vars,但我不确定是否作为证据。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

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次打印两次。