12

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

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

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

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

感谢您的任何评论。

4

3 回答 3

13

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

文档

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

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

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

于 2013-04-22T13:00:54.577 回答
5

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

请注意, var不是值,它们明确旨在成为对值/函数的可变引用。

于 2013-04-22T13:15:50.557 回答
2

在 FP 中的对象应该是不可变的。

这是不正确的。

函数式编程要求变量是不可变的值。但是,Clojure 不是一种纯粹的函数式语言,它允许在任何地方出现无法跟踪的副作用。

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

于 2013-04-22T13:15:42.487 回答