Clojure 为什么可以重新定义Var(假设在FP中,值是不可变的)?
我使用逆时针运行REPL,但我在Leiningen上也注意到了这一点 我可以调用def来定义一个var两次。比如说,Clojure 为什么可以重新定义Var(假设在FP中,值是不可变的)?,clojure,Clojure,我使用逆时针运行REPL,但我在Leiningen上也注意到了这一点 我可以调用def来定义一个var两次。比如说, => (def a 1) #'fractal.core/a => a 1 => (def a 2) #'fractal.core/a => a 2 Clojure是一种函数式编程语言,在FP中,对象应该是不可变的。如果我能做到这一点,a在什么意义上是不可变的 感谢您的评论。变量的全部要点是它们可以反弹,因此命名为:var->variable 从: Clo
=> (def a 1)
#'fractal.core/a
=> a
1
=> (def a 2)
#'fractal.core/a
=> a
2
Clojure是一种函数式编程语言,在FP中,对象应该是不可变的。如果我能做到这一点,a在什么意义上是不可变的
感谢您的评论。变量的全部要点是它们可以反弹,因此命名为:var->variable 从: Clojure是一种实用的语言,它认识到偶尔需要保持对不断变化的值的持久引用。。。Vars提供了一种机制来引用可变存储位置,该存储位置可以在每个线程的基础上动态反弹(到新的存储位置) 您不能通过重新绑定变量来更改任何不可变的值 想象一下,只给一个不可变值起一个名字,然后给另一个不可变值起这个名字 在FP中,对象应该是不可变的 这是不正确的 纯函数式编程要求变量是不可变的值。 然而,Clojure不是一种纯粹的功能性语言,它允许在任何地方出现未经跟踪的副作用
在这方面,大多数函数式语言都是不纯的,因为它们不跟踪语言本身中出现的副作用,如突变。re-
def
ing var(即设置根绑定,而不是临时/线程本地重新绑定)主要是为了作为开发工具。由于标准全局函数和值(使用def/defn定义的函数和值)是基于var的,因此可以重新定义它们,而无需重新启动正在编辑的clojure程序
请注意,变量不是值,它们明确表示为值/函数的可变引用。严格来说,它并没有改变变量的值,这就是所谓的重新绑定(在命令式语言中考虑阴影)。@om nom nom这与阴影完全不同。如果您愿意,您可以称之为重新绑定,但这与更改var的值没有什么特别的区别;是的,var仍然具有相同的“值”,因为它仍然保持着它过去使用的相同可变单元格,但该单元格的内容已经改变,这就是通常所说的改变事物值的意思。在FP中,应该使对象不可变,并尽可能多地使用纯函数,这并不是不正确的。事实上,你可以用一种不纯的FP语言(比如Clojure)来改变状态,这并不意味着这是一种好的做法。我想这取决于OP中“假定”的意思