以下page讨论了原子如何在Clojure中发挥作用。它并没有充分说明Clojure和其他lisp方言中原子之间的差异。
Common Lisp中的原子和Clojure中的原子之间的主要区别是什么? (CL中存在的Clojure中的atom定义缺少什么?)
答案 0 :(得分:19)
Clojure中的原子和Common Lisp中的原子(以及大多数其他Lisps)是两个完全不相关的概念。除了具有相同的名称之外,它们彼此无关。
没有'差异'。它会问房子里的窗户和电脑屏幕上的窗口有什么区别?识别差异是没有意义的,因为这两个概念没有关系。
Clojure中的“原子”管理状态。 Lisp中的'Atoms'是所有非缺陷单元格的数据类型(如数字,字符,字符串,符号......)。在Lisp中,函数ATOM
简单地定义为:
(defun atom (object)
(not (consp object)))
由于Clojure没有cons单元格且没有函数consp
,因此无法说(not (consp object))
。因此,在Clojure中不存在像'atom'这样的Lisp概念。请注意,Clojure有一个函数cons
,但它不像Lisp那样创建cons单元格。
答案 1 :(得分:1)
它们大不相同,并且使用“Atom”这个名称具有共同的概念基础
普通lisp中的原子指的是不可分割的东西的概念,就像物质原子的起源意义一样。
clojure中的Atom指的是一个特定的可变数据结构,以原子方式'更改它是对它的写入完成或不完成(并随后重试)
共同的想法是不可分割的概念。在CL中它是什么东西,在Clojure中它是如何改变的。
在Clojure中,当您需要阻止不协调的可变数据时使用原子。例如单个userId计数器或其他东西。 Clojure还协调了Refs中的可变访问(想想银行帐户转移)和代理中的原子不协调的非阻塞可变事物(例如日志收集器)。
答案 2 :(得分:0)
在所有Lisps 原子中符号表达式 不是列表(空列表除外)。它们也被称为原子S表达式。什么是原子的(不可分割的)?从历史上看,这些列表可以分成较小的部分,其中包含的原子(但不是非空列表)不能包含。
在Clojure中还有原子S表达式,但也有一个名为 Atom 的数据结构,它允许创建可由多个线程访问的可变数据对象。它们中的原子是什么? 操作。
如果您修改Atom,其状态将成功更改或不成功。不会有一半的情况(例如某些矢量)会改变而另一半则不会改变。如果操作不成功,则重试该操作并且当前线程等待直到完成。
Lisp的原子和Clojure的原子有什么区别?抽象层次。 Lisp的原子是一类符号表达式,而Clojure的Atoms是一类用于处理共享数据的数据结构。