Common Lisp中,原子(atom)和符号(symbol)有什么区别?

17

在Common Lisp中,称为“原子”的东西和符号之间有什么区别吗?

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

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


“Atom”这个名字来自于希腊语中的“原子”(atomos),意为“不可分割的”。因此,分子被认为是由不可分割的粒子组成的,而在Lisp中,任何不是cons的东西通常都不能被分割。 - erjiang
4个回答

15
在Common Lisp中,原子被准确地定义为任何不是cons的对象。有关更多详细信息,请参见http://l1sp.org/cl/atom
我不知道Lisp家族中的其他语言。

6

'atom'通常用于列表处理。在Common Lisp中,某物要么是非空列表,要么是原子。在以前,原子也被称为“原子符号”,这与稍有不同。现在,在Common Lisp中,原子不仅是符号,还包括其他任何不是cons单元的东西(例如:字符串,数字,哈希表,流等)。

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

因此,原子是一组数据结构。符号是一种特定的数据结构,也恰好是一个原子。


1
在Scheme中,原子是指不是一对的任何东西:
> (pair? 1)
#f
> (pair? '(1 2 3))
#t
> (pair? 'a)
#f

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

这只是Scheme中“原子”的可能定义之一。 - Fred Foo

0
在Common Lisp中,符号非常类似于其他语言中的变量,尽管更加重量级(它不仅仅是一个足够大以容纳值的空白内存块)。通常会将其intern化,以便可以通过名称引用它,尽管也可以有匿名符号(就像C中您可能只通过指针引用的内存一样)。
原子是一些不是cons单元格的值。符号是一个原子,数字、字符串和许多其他东西也是原子。 cons单元格最常见的用途是组成列表,尽管也可以以其他方式使用它们。

1
一个符号不像其他语言中的变量。一个符号是一个带有名称的“对象”。在源代码中,我们用符号写变量,但这并不意味着一个符号一定是一个变量。(defun foo(bar) bar) <- 这里的BAR是源代码中的一个符号,但是在编译后的函数FOO中,这个符号不是变量。 - Rainer Joswig
@Rainer:很遗憾,我不知道如何用立即可理解的方式描述CL符号。它不仅仅是一个具有名称的对象。它甚至不必要有名称(考虑(gensym)),而且它是一种相当奇怪的对象。 - David Thornley
1
当然它有一个名字:(symbol-name (gensym)) -> "G1620994"。这只是一个计算出来的名字。符号是一个对象,它有一个名字,如果它在一个包中被内部化,就可以通过名字查找,并且可以用于引用值、函数、它所在的包、它的名字和属性列表。 - Rainer Joswig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接