Clojure 在Common Lisp中,原子和符号有什么区别?

Clojure 在Common Lisp中,原子和符号有什么区别?,clojure,scheme,common-lisp,symbols,Clojure,Scheme,Common Lisp,Symbols,在Common Lisp中,你称之为原子和符号之间有什么区别吗 这些差异是否扩展到Lisp系列中的其他语言 (我知道atom在Clojure中有不同的含义,但我对符号的边界感兴趣。)在Common Lisp中,atom被精确地定义为任何不是cons的对象。有关更多详细信息,请参阅 我不知道Lisp家族中的其他语言。在Scheme中,atom是指任何不是成对的语言: > (pair? 1) #f > (pair? '(1 2 3)) #t > (pair? 'a) #f 因此,

在Common Lisp中,你称之为原子和符号之间有什么区别吗

这些差异是否扩展到Lisp系列中的其他语言

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

在Common Lisp中,atom被精确地定义为任何不是cons的对象。有关更多详细信息,请参阅


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

在Scheme中,atom是指任何不是成对的语言:

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

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

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


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

通常从列表处理中可以看到“原子”。在常见的Lisp语言中,有的是非空列表,有的是atom。在以前,一个原子也被称为“原子符号”,这是稍微不同的东西。现在,在通用的Lisp语言中,原子不仅是符号,而且是非cons单元格的所有东西(例如:字符串、数字、哈希表、流等等)

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


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

符号与其他语言中的变量不同。符号是带有名称的“对象”。在源代码中,我们用符号编写变量,但这并不意味着符号一定是变量。(defun foo(bar)bar)@Rainer:不幸的是,我不知道用什么好的方式来描述CL符号,而这种方式很容易理解。它不仅仅是一个有名称的对象。它甚至不必有名字(想想
(gensym)
),它是一种相当奇怪的对象。当然它有一个名字:(symbol name(gensym))->“G1620994”。它只是一个计算名称。符号是一个有名称的对象,如果它位于包中,则可以通过名称查找,并可用于引用值、函数、其包、名称和属性列表。这只是Scheme中“atom”的可能定义之一。“atom”的名称来自希腊语“atomos”,意思是“不可分割”。因此,分子被认为是由不可分割的粒子组成,这些粒子被标为“原子”,任何在Lisp中不是cons的东西通常都不能被分割。