为什么可以重新定义Var(假设FP值是不可变的)?

Sol*_*lma 12 clojure

我使用逆时针运行REPL,但我也注意到了Leiningen.

我可以调用def来定义var两次.例如,

=> (def a 1)
#'fractal.core/a
=> a
1
=> (def a 2)
#'fractal.core/a
=> a
2
Run Code Online (Sandbox Code Playgroud)

Clojure是一种函数式编程语言,在FP对象中应该是不可变的.如果我能在什么意义上做到这一点是不可改变的?

谢谢你的评论.

slo*_*oth 13

变量的整个点是它们可以反弹,因此名称:var - > variable.

来自文档:

Clojure是一种实用的语言,可以识别偶尔需要保持对不断变化的值的持久引用.... Vars提供了一种机制来引用可变存储位置,该位置可以基于每个线程动态地反弹(到新的存储位置).

您没有通过重新绑定var来更改任何不可变值.

可以想象它只是给一个不可变值一个名字,然后给另一个不可变值这个名字.


Joo*_*aat 5

重新定义defvar(即设置根绑定,而不是临时/线程局部重新绑定)主要是用于开发的工具.由于标准全局函数和值(使用def/defn定义的那些)是基于var的,因此您可以重新定义它们,而无需重新启动正在编辑的clojure程序.

请注意,变量不是值,它们明确地旨在是值/函数的可变引用.