2010-10-04 60 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原子是一組數據結構。符號是一個特定的數據結構,它也恰好是一個原子。

相關問題