首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于瓦尔斯·克洛尔的问题

关于瓦尔斯·克洛尔的问题
EN

Stack Overflow用户
提问于 2015-06-20 23:04:57
回答 2查看 142关注 0票数 3

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-20 23:32:36

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

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

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

你可以观看关于价值的里奇的谈话

摘要将是,当您在Clojure中编程时,您拥有的是值,而不是对可能更改的位置的引用(甚至可能被另一个线程更改)。

所以。

代码语言:javascript
复制
(let [a 1 
      _ (println a) => prints 1
      a 2 
      _ (println a) => prints 2
     ]) 

即使在代码中出现了“更改a”的错觉,您也不会更改“旧”a --您只是有了一个新的值。(如果有人看了第一个定义,它仍然会看到值1)。

实际上,您可以看到作为一个组合函数调用的赋值序列,在这些调用中,a将在作用域中被替换,但根本不是相同的“变量”。

代码语言:javascript
复制
 ((fn [a]
    (println a) => prints 1
    ((fn [a]
        (println a) => prints 2
      ) 2) 1)

尽管如此,如果您需要一个可变的存储,并且可能有许多线程访问该存储、克洛尔 varsatomsrefs等等。

票数 5
EN

Stack Overflow用户

发布于 2015-06-24 07:47:54

考虑将def定义为常量。它可以通过再次调用def进行更改,但您可以调用不应该这么做

变量的关闭部分是代理,它是线程安全的。

代码语言:javascript
复制
(def counter (agent 0))
(send counter inc)
@counter
;;=> 1

您还可以访问Java类中的变量。

新班

代码语言:javascript
复制
(def object (ClassName.))

Se值

代码语言:javascript
复制
(.fieldName object)

设定值

代码语言:javascript
复制
(set! (.fieldName object) 5)

没有变量的“整体”点是使程序自动线程安全。这是因为线程错误将在线程1上“总是”失败,它将告诉变量a为1,而线程b告诉a为2,在此之后发生故障。这也是使用纯函数的原因--没有变量“无”线程问题。

还请参阅这个问题: Ref,Var,Agent,Atom在法律上的差异,举个例子和这个克洛尔:瓦尔斯,原子和参参(噢,我的)

像80%或以上那样对待"“,而不是100%。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30959709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档