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