我是Clojure的新手,我读到它是一种函数式语言。它说Clojure没有变量,但是当我找到(Defn5)时,它和变量有什么区别呢?
我可以在之后更改变量的值,那么它真的与变量有那么大的不同吗?我不明白有什么区别。
发布于 2015-06-20 23:32:36
假设variable指的是一个可变的存储位置,我猜主要的区别(取决于您所比较的语言)是,如果您在Clojure中动态地重新绑定var是基于每个线程的。
但很长的答案是,除非确实需要对可变存储位置的引用,否则通常不会在Clojure中使用var。
Clojure支持不可变性和使用值而不是引用进行编程。
你可以观看关于价值的里奇的谈话。
摘要将是,当您在Clojure中编程时,您拥有的是值,而不是对可能更改的位置的引用(甚至可能被另一个线程更改)。
所以。
(let [a 1
_ (println a) => prints 1
a 2
_ (println a) => prints 2
]) 即使在代码中出现了“更改a”的错觉,您也不会更改“旧”a --您只是有了一个新的值。(如果有人看了第一个定义,它仍然会看到值1)。
实际上,您可以看到作为一个组合函数调用的赋值序列,在这些调用中,a将在作用域中被替换,但根本不是相同的“变量”。
((fn [a]
(println a) => prints 1
((fn [a]
(println a) => prints 2
) 2) 1)尽管如此,如果您需要一个可变的存储,并且可能有许多线程访问该存储、克洛尔 vars、atoms、refs等等。
发布于 2015-06-24 07:47:54
考虑将def定义为常量。它可以通过再次调用def进行更改,但您可以调用不应该这么做。
变量的关闭部分是代理,它是线程安全的。
(def counter (agent 0))
(send counter inc)
@counter
;;=> 1您还可以访问Java类中的变量。
新班
(def object (ClassName.))Se值
(.fieldName object)设定值
(set! (.fieldName object) 5)没有变量的“整体”点是使程序自动线程安全。这是因为线程错误将在线程1上“总是”失败,它将告诉变量a为1,而线程b告诉a为2,在此之后发生故障。这也是使用纯函数的原因--没有变量“无”线程问题。
还请参阅这个问题: Ref,Var,Agent,Atom在法律上的差异,举个例子和这个克洛尔:瓦尔斯,原子和参参(噢,我的)。
像80%或以上那样对待"“,而不是100%。
https://stackoverflow.com/questions/30959709
复制相似问题