Common Lisp中的原子与Clojure中的原子有什么区别?

Common Lisp中的原子与Clojure中的原子有什么区别?,clojure,lisp,common-lisp,Clojure,Lisp,Common Lisp,下面讨论原子在Clojure中的工作原理。它并没有说明Clojure和其他lisp方言中原子之间的差异 Common Lisp中的原子与Clojure中的原子的主要区别是什么?(存在于CL中的Clojure中的原子定义缺少什么?Clojure中的原子和Common Lisp(以及大多数其他Lisp)中的原子是两个完全不相关的概念。他们彼此之间没有任何关系,只是同名而已 没有“区别”。它会问,房子里的窗户和你电脑屏幕上的窗户有什么区别?识别差异是没有意义的,因为这两个概念并不相关 Clojure管

下面讨论原子在Clojure中的工作原理。它并没有说明Clojure和其他lisp方言中原子之间的差异


Common Lisp中的原子与Clojure中的原子的主要区别是什么?(存在于CL中的Clojure中的原子定义缺少什么?

Clojure中的原子和Common Lisp(以及大多数其他Lisp)中的原子是两个完全不相关的概念。他们彼此之间没有任何关系,只是同名而已

没有“区别”。它会问,房子里的窗户和你电脑屏幕上的窗户有什么区别?识别差异是没有意义的,因为这两个概念并不相关

Clojure管理状态下的“原子”

Lisp中的“Atoms”表示所有非cons单元格的数据类型(如数字、字符、字符串、符号等)

在Lisp中,函数
ATOM
的定义如下:

(defun atom (object)
   (not (consp object)))

由于Clojure没有cons单元格,也没有函数
consp
,因此不能说
(不是(consp对象))
。因此,Clojure中不存在类似“atom”的Lisp概念。请注意,Clojure有一个函数cons,但它不像Lisp中那样创建cons单元格。

它们有很大的不同,使用“Atom”这个名称有一个共同的概念基础

  • Common lisp中的Atom指的是不可分割的事物的概念,如物质原子的原始含义

  • clojure中的Atom指的是一个特定的可变数据结构,它“原子地”更改,即对它的写入要么完成,要么不完成(随后重试)

共同的想法是不可分割的概念。在CL中是事物是什么,在Clojure中是事物如何变化


在Clojure中,当需要阻塞不协调的可变数据时,可以使用原子。例如,单个用户ID计数器或其他东西。Clojure还具有REF中的协调可变访问(比如银行账户转账)和代理中的原子非协调非阻塞可变内容(比如日志收集器)

在所有Lisp中,原子都是符号表达式,而不是列表(空列表除外)。它们也被称为原子S表达式。它的原子(不可分割)是什么?从历史上看,这些列表可以划分为更小的部分,而其中包含的原子(但不是非空列表)却不能

Clojure中也有原子S表达式,但也有一个名为Atom的数据结构,它允许创建可由多个线程访问的可变数据对象。它们里面有什么原子?操作

如果你修改一个原子,它的状态是否会成功改变。不会出现其中一半(例如某个向量)会改变而另一半不会改变的情况。如果操作不成功,则重试操作,当前线程将等待操作完成


Lisp的原子和Clojure的原子有什么区别?抽象层。Lisp的原子是一类符号表达式,而Clojure的原子是一类用于处理共享数据的数据结构。

值得注意的是,Clojure在符号、关键字、数字、字符串等方面仍然有Lisp原子,但它不是Clojure词汇表的一部分。@John Cromartie:这不可能。Clojure没有cons细胞。在Lisp中,atom被定义为“非cons”。由于clojure没有cons单元格,因此在clojure中未定义Lisp原子的概念。注意Clojure有一个cons操作,但它不创建cons单元格。Common Lisp不知道“不可分割”的东西。cons就像两个插槽的记录,就像两个条目的特殊用途向量。原子的概念仅仅是指它是一个细胞以外的任何东西。但是cons单元格作为一种数据结构并没有什么特别之处(与数组、向量、字符串、结构、CLOS对象等相反),它只在Lisp中特别,因为它被广泛使用。这是完全错误的。一个符号是一个原子,但它不会对自己求值。事实上,在较旧的Lisps中,许多其他东西并没有对自己进行评估。对他们的评估是错误的。作为一个原子和评价是无关的<代码>原子的主要意思是:不是非空列表的所有内容。所有不是cons细胞的东西都是原子。谢谢你纠正我。当我想到原子时,我被关键词吸引住了。删除了关于自我评估的错误陈述。