Clojure中的所有变量都是常量吗?

时间:2017-01-16 13:34:38

标签: clojure

是否可以选择在Clojure中为符号赋值,然后重新分配相同的符号?我现在看到的是Clojure中的所有变量都是不变的。这样对吗?

3 个答案:

答案 0 :(得分:6)

  • 本地名称可以反弹:
  • (全局)符号可以反弹。
  • 有一些符号可以是(通常)符号的东西 绑定到其内容是可变的:

这些最后各有不同的特点和目的。

来自the above

  

注意 - 您无法分配函数参数或本地绑定。只要   Java字段,Vars,Refs和Agent在Clojure中是可变的。

重新绑定本地名称的示例:

(let [coll (range)
      coll (rest coll)
      coll (filter odd? coll)
      coll (take 5 coll)]
  coll)
;(1 3 5 7 9)

答案 1 :(得分:2)

所有局部变量 - 无论是let - 绑定还是fn - 绑定(fn参数) - 都是不变的,这是对的。 (它们就像数学变量一样,你可以评估它们在变量值的各种赋值下所涉及的表达式,但在任何单一的这种评估期间,指定的值必须保持不变。)

请注意,在嵌套范围内,这些本地人可以通过同名的本地人阴影;阴影局部可以有独立的值,但它们也不能重新分配。

还有一个独特的Vars概念 - 由def形式最常引入的顶级对象。这些可以使其根值反弹,另外,如果标记为:dynamic,则可以在本地反弹线程。

答案 2 :(得分:0)

这似乎遵循以下文档:http://funcool.github.io/clojurescript-unraveled/#state-management

    cljs.user=> (def x (volatile! 2))
    #'cljs.user/x
    cljs.user=> x
    #object [cljs.core.Volatile {:val 2}]
    cljs.user=> (deref x)
    2
    cljs.user=> (vreset! x 5)
    5
    cljs.user=> x
    #object [cljs.core.Volatile {:val 5}]
    cljs.user=> (deref x)
    5

但是,我发现所有关于"不可移动的东西"概念上不连贯。也许更有知识的人可以评论。