Common Lisp 中的原子和符号有啥区别?

Posted

技术标签:

【中文标题】Common Lisp 中的原子和符号有啥区别?【英文标题】:What is the difference between an atom and a symbol in Common Lisp?Common Lisp 中的原子和符号有什么区别? 【发布时间】:2011-04-20 18:49:47 【问题描述】:

Common Lisp 中的原子和符号之间有什么区别吗?

这些差异是否扩展到 Lisp 家族中的其他语言?

(我知道原子在 Clojure 中具有不同的含义,但我对符号的边界感兴趣。)

【问题讨论】:

“原子”这个名字来自希腊语“atomos”,意思是“不可分割的”。因此,分子被认为是由称为“原子”的不可分割的粒子组成的,任何在 Lisp 中不是 cons 的东西通常都不能被分割。 【参考方案1】:

在 Common Lisp 中,atom 被精确地定义为任何不是 cons 的对象。详情请见http://l1sp.org/cl/atom。

我不知道 Lisp 家族中的其他语言。

【讨论】:

【参考方案2】:

'atom' 通常从列表处理中看到。在 Common Lisp 中,有些东西要么是一个非空列表,要么是一个原子。在以前,原子也被称为“原子符号”,这略有不同。现在在 Common Lisp 中,原子不仅是符号,还有其他不是 cons 单元格的东西(例如:字符串、数字、哈希表、流......)。

如果某物不是原子(是 cons),则可以使用 CAR、CDR、FIRST 和 REST 操作。

所以 atom 是一组数据结构。符号是某种数据结构,也恰好是一个原子。

【讨论】:

【参考方案3】:

在 Scheme 中,原子是任何不是对的东西:

> (pair? 1)
#f
> (pair? '(1 2 3))
#t
> (pair? 'a)
#f

因此符号是原子,就像数字和字符串一样。 atom 在 Common Lisp 中有类似的定义,其中函数 (atom object) 被定义为 (not (consp object))

【讨论】:

这只是 Scheme 中“原子”的可能定义之一。【参考方案4】:

在 Common Lisp 中,符号与其他语言中的变量非常相似,尽管它更重量级(它不仅仅是一块大到足以容纳值的空白内存)。它通常是interned,因此可以通过名称引用它,尽管它可能有匿名符号(很像 C 中的内存,您可能只能通过指针引用)。

原子是一些不是cons 单元格的值。符号是原子,数字、字符串和许多其他事物也是如此。 cons 单元格最常见的用途是组成列表,但也可以以其他方式使用它们。

【讨论】:

符号不像其他语言中的变量。符号是带有名称的“对象”。在源代码中,我们用符号编写变量,但这并不意味着符号必然是变量。 (defun foo (bar) bar) @Rainer:不幸的是,我不知道用一种可以立即理解的方式来描述 CL 符号的好方法。它不仅仅是一个有名字的对象。它甚至不必有名字(想想(gensym)),它是一种相当奇怪的对象。 确定它有一个名字:(symbol-name (gensym)) -> "G1620994"。它只是一个计算的名称。符号是一个有名字的对象,如果它被嵌入在一个包中,可以通过名字来查找它,并且可以用来引用一个值、一个函数、它的包、它的名字和一个属性列表。

以上是关于Common Lisp 中的原子和符号有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

common-lisp:绑定和符号之间的区别

解析 Common Lisp 列表中的符号

Lisp 值得去学习吗

Racket(lisp 编程语言)中的 [ ] 和 ( ) 括号有啥区别?

在 Common Lisp 中,符号名称是不是有定义的最大长度?

Common lisp——为啥这个符号不是外部的?