为什么我可以改变Clojure中的不可变变量?



我来自使用const声明不可变变量的Javascript世界。

不可变变量的定义在Clojure中以同样的方式解释。

但是,这是允许的:

(def cheese "I like cheese")
...
...
(def cheese "Actually, I changed my mind)

当我运行这个时,repl给了我actually, I changed my mind

在JS中,它会抛出一个错误,因为const不能被改变。

如果有人解释我对immutable variables

的理解在clojure世界中是不正确的,我会很感激的。

感谢

确切地说,Clojure有不可变值,而不是不可变变量。毕竟,名称Var是"变量"的简写。

想象数字5。你永远不需要担心谁"拥有"它。它,或者有人会改变它的定义。同样,在你的程序的许多部分中,这个数字可以有许多副本用于许多目的。Clojure将此思想扩展到集合值,如向量[1 2 3]或映射{:first "Joe" :last "Cool"}

话虽如此,在Clojure中,Var通常用于全局"常量"。永远不会改变的值(尽管可以改变)。使用ClojureAtom(全局或局部)是正常的值的变化。还有许多其他选项(例如,像reduce这样的函数有一个内部累加器)。

这个文档来源列表是一个很好的起点,尤其是"Getting Clojure"one_answers"勇敢的clojure"。

正如Alan提到的,Clojure有不可变的值,而不是不可变的变量。

当你执行

(def x 42)

所发生的是一个ClojureVar被创建,Var被绑定到名称(也就是符号)x,并且不可变的值42被放置在Var中。通常情况下,Var中只能放置一个值,但是,在您的示例中,可以在不同的时间将不同的不可变值放置在Var中。

阅读Clojure变量和全局环境可能会有帮助。

最新更新