gpt4 book ai didi

clojure - 关于 Vars Clojure 的问题

转载 作者:行者123 更新时间:2023-12-02 18:30:14 26 4
gpt4 key购买 nike

我是 Clojure 的新手,我读到它是一种函数式语言。它说Clojure没有变量,但是当我找到(def n 5)时,它和变量有什​​么区别?

我可以在之后更改 var 的值,那么它真的与变量有那么不同吗?我不明白其中的区别。

最佳答案

假设变量是指引用可变存储位置,我猜主要区别(取决于您比较的语言)是,如果您动态重新绑定(bind)Clojure 中的 var 是基于每个线程的。

但长的答案是,除非您确实需要对可变存储位置的引用,否则您通常不会在 Clojure 中使用 var

Clojure 支持不变性和使用值而不是引用进行编程。

您可以观看Rich Hickey's talk关于值(value)观。

总结是,当您在 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)

尽管如此,如果您需要一个可变存储,并且可能有多个线程访问该存储,Clojure gives you varsatomsrefs

关于clojure - 关于 Vars Clojure 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30959709/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com