2010-10-04 63 views
12

Common Lisp中你会称之为原子和符号有什么不同?Common Lisp中的原子和符号有什么区别?

这些差异是否延伸到Lisp系列的其他语言?

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

+0

“atom”这个名字来源于希腊语“atomos”,意思是“不可分割的”。所以,分子被认为是由不可分割的粒子组成的,这些粒子包含着“原子”,而Lisp中不是“缺点”的东西通常不会被分裂。 – erjiang 2010-10-06 18:42:05

回答

11

Common Lisp中,原子被精确定义的任何对象这不是一个坏处。有关更多详细信息,请参阅http://l1sp.org/cl/atom

我不知道Lisp系列中的其他语言。

1

在方案,一个原子是任何不是一对:

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

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

+0

这只是Scheme中“atom”的可能定义之一。 – 2010-10-04 17:49:30

0

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

原子的某个值不是cons单元格。一个符号是一个原子,一个数字,一个字符串以及其他许多东西也是如此。 cons单元格的最常见用途在于列表,尽管可以以其他方式使用它们。

+1

一个符号不像其他语言的变量。一个符号是一个名字的“对象”。在源代码中,我们使用符号编写变量,但这并不会使符号变成一个变量。 (defun foo(bar)bar)< - 这里BAR是源代码中的符号,但符号不是编译函数FOO中的变量。 – 2010-10-04 17:09:32

+0

@Rainer:不幸的是,我不知道用一种可以立即理解的方式描述CL符号的好方法。它不只是一个名称的对象。它甚至不需要有一个名字(想想'(gensym)'),这是一个相当奇怪的对象。 – 2010-10-04 19:23:52

+0

确定它有一个名称:(symbol-name(gensym)) - >“G1620994”。它只是一个计算名称。符号是一个具有名称的对象,如果它被封装在一个包中并且可以用来引用一个值,一个函数,它的包,它的名称和一个属性列表,那么它就可以按名称查找。 – 2010-10-04 19:36:53

4

'atom'通常从列表处理中看到。在Common Lisp中,有些东西是非空列表或原子。在过去,一个原子也被称为“原子符号”,这有点不同。现在在Common Lisp中,原子不仅是符号,而且其他所有不是缺陷的单元格(例如:字符串,数字,散列表,流,...)。

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

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

相关问题