请在2024 Clojure状态调查!分享您的想法。

欢迎!请参阅关于页面以获取更多关于如何工作的小信息。

0投票
语法和读取器

亲爱的Clojure社区成员们!
“keyword”和“atom”之间的区别是什么?
对不起,我还是一个彻底的新手 :-)

2 答案

+2投票

被选中的答案
 
最佳答案

关键字是等同于自身的符号标识符。它们通常用作映射中的键,以命名属性或作为枚举值。

例如,在映射{:first-name "SpongeBob", :last-name "SquarePants"}中有两个条目使用键:first-name:last-name

参见:https://clojure.org/reference/data_structures#Keywords

原子实际上是一些盒子,这些盒子可以保存一个值,并且可以通过对该现有值应用一个函数来原子性地更新它。例如,您可以用一个原子构造一个计数器,然后递增它(如果有需要,可以从多个线程安全地递增)。

(def counter (atom 0))
(swap! counter inc) ;; increment counter
@counter ;; read counter: 1

参见:https://clojure.org/reference/atoms

那么... 原子是一个可变的变量吗?
是的,原子提供了受控的可变能力——当通过应用于前一个值的函数进行更新时是线程安全的。也请参阅引用和代理——https://clojure.org/reference/refshttps://clojure.org/reference/agents
谢谢! :-)
0投票

完全不关注原子,这里是对关键词的非正式看法

我喜欢将关键词在概念上视为一种具有特殊超能力的字符串/符号混合体。像符号一样,它们受到某些字符的限制(尤其是不允许空格)并且可以命名空间::myproject.api/foo。像字符串一样,它们实际上只是一个数据原语。

关键词的主要超能力是它们可以作为函数被调用,从关联数据结构(如哈希图)中获取值:(:foo {:foo 42 "bar" 36}) === 42 和集合:(:foo #{:foo :bar}) === :foo。你不能使用字符串或数字作为函数。

这里有一个有用的StackOverflow关于为什么Clojure中存在关键词的回答:https://stackoverflow.com/a/11655615

by
谢谢! :-)
...