Clojure的特殊形式'def'是否总是创建一个新的变量?
我知道在Clojure中,名称空间将符号映射到变量。因此,我们可以将符号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,或者是否更新了我在上面创建的同一
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或Rubyid
的东西。