Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 为什么可以重新定义Var(假设在FP中,值是不可变的)?_Clojure - Fatal编程技术网

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

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

我使用逆时针运行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

从:

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

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

想象一下,只给一个不可变值起一个名字,然后给另一个不可变值起这个名字

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

这是不正确的

纯函数式编程要求变量是不可变的值。 然而,Clojure不是一种纯粹的功能性语言,它允许在任何地方出现未经跟踪的副作用


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

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


请注意,变量不是值,它们明确表示为值/函数的可变引用。

严格来说,它并没有改变变量的值,这就是所谓的重新绑定(在命令式语言中考虑阴影)。@om nom nom这与阴影完全不同。如果您愿意,您可以称之为重新绑定,但这与更改var的值没有什么特别的区别;是的,var仍然具有相同的“值”,因为它仍然保持着它过去使用的相同可变单元格,但该单元格的内容已经改变,这就是通常所说的改变事物值的意思。在FP中,应该使对象不可变,并尽可能多地使用纯函数,这并不是不正确的。事实上,你可以用一种不纯的FP语言(比如Clojure)来改变状态,这并不意味着这是一种好的做法。我想这取决于OP中“假定”的意思