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

时间:2013-04-22 12:47:36

标签: clojure

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

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

=> (def a 1)
#'fractal.core/a
=> a
1
=> (def a 2)
#'fractal.core/a
=> a
2

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

感谢您提出任何意见。

3 个答案:

答案 0 :(得分:13)

vars的全部意义在于它们可以反弹,因此得名:var - >变量

来自docs

  

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

您不会通过重新绑定变量来更改任何不可变值。

认为只是给一个不可变值一个名字,然后给另一个名字的不可变值。

答案 1 :(得分:5)

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

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

答案 2 :(得分:2)

  FP对象中的

应该是不可变的。

这是不正确的。

函数式编程要求变量是不可变的值。 但是,Clojure不是一种纯粹的功能性语言,并且可以在任何地方进行无痕的副作用。

在这方面,大多数函数式语言都是不纯的,因为它们不会跟踪语言本身中出现的副作用,例如变异。