我正在使用逆时针运行REPL,但我也注意到了Leiningen。
我可以调用def来定义var两次。例如,
=> (def a 1)
#'fractal.core/a
=> a
1
=> (def a 2)
#'fractal.core/a
=> a
2
Clojure是一种函数式编程语言,在FP对象中应该是不可变的。如果我能在什么意义上做到这一点是不可改变的?
感谢您提出任何意见。
答案 0 :(得分:13)
vars的全部意义在于它们可以反弹,因此得名:var - >变量
来自docs:
Clojure是一种实用的语言,它可以识别偶尔需要保持对不断变化的值的持久引用。 ... Vars提供了一种机制来引用可变存储位置,该位置可以基于每个线程动态地反弹(到新的存储位置)。
您不会通过重新绑定变量来更改任何不可变值。
认为只是给一个不可变值一个名字,然后给另一个名字的不可变值。
答案 1 :(得分:5)
重新def
一个var(即设置根绑定,而不是临时/线程局部重新绑定)主要是用于开发的工具。由于标准全局函数和值(使用def / defn定义的那些)是基于var的,因此您可以重新定义它们,而无需重新启动正在编辑的clojure程序。
请注意,vars是不是值,它们明确地旨在对值/函数的可变引用。
答案 2 :(得分:2)
FP对象中的应该是不可变的。
这是不正确的。
纯函数式编程要求变量是不可变的值。 但是,Clojure不是一种纯粹的功能性语言,并且可以在任何地方进行无痕的副作用。
在这方面,大多数函数式语言都是不纯的,因为它们不会跟踪语言本身中出现的副作用,例如变异。