第八章:符號

2018-02-24 15:50 更新

我們一直在使用符號。符號,在看似簡單的表面之下,又好像沒有那么簡單。起初最好不要糾結(jié)于背后的實現(xiàn)機(jī)制??梢园逊柈?dāng)成數(shù)據(jù)對象與名字那樣使用,而不需要理解兩者是如何關(guān)聯(lián)起來的。但到了某個時間點,停下來思考背后是究竟是如何工作會是很有用的。本章解釋了背后實現(xiàn)的細(xì)節(jié)。

8.1 符號名 (Symbol Names)

第二章描述過,符號是變量的名字,符號本身以對象所存在。但 Lisp 符號的可能性,要比在多數(shù)語言僅允許作為變量名來得廣泛許多。實際上,符號可以用任何字符串當(dāng)作名字??梢酝ㄟ^調(diào)用?symbol-name?來獲得符號的名字:

> (symbol-name 'abc)
"ABC"

注意到這個符號的名字,打印出來都是大寫字母。缺省情況下, Common Lisp 在讀入時,會把符號名字所有的英文字母都轉(zhuǎn)成大寫。代表 Common Lisp 缺省是不分大小寫的:

> (eql 'abc 'Abc)
T
> (CaR '(a b c))
A

一個名字包含空白,或其它可能被讀取器認(rèn)為是重要的字符的符號,要用特殊的語法來引用。任何存在垂直杠 (vertical bar)之間的字符序列將被視為符號??梢匀缦逻@般在符號的名字中,放入任何字符:

> (list '|Lisp 1.5| '|| '|abc| '|ABC|)
(|Lisp 1.5| || |abc| ABC)

當(dāng)這種符號被讀入時,不會有大小寫轉(zhuǎn)換,而宏字符與其他的字符被視為一般字符。

那什么樣的符號不需要使用垂直杠來參照呢?基本上任何不是數(shù)字,或不包含讀取器視為重要的字符的符號。一個快速找出你是否可以不用垂直杠來引用符號的方法,是看看 Lisp 如何印出它的。如果 Lisp 沒有用垂直杠表示一個符號,如上述列表的最后一個,那么你也可以不用垂直杠。

記得,垂直杠是一種表示符號的特殊語法。它們不是符號的名字之一:

> (symbol-name '|a b c|)
"a b c"

(如果想要在符號名稱內(nèi)使用垂直杠,可以放一個反斜線在垂直杠的前面。)

譯注: 反斜線是?\?(backslash)。

8.2 屬性列表 (Property Lists)

在 Common Lisp 里,每個符號都有一個屬性列表(property-list)或稱為?plist?。函數(shù)?get?接受符號及任何類型的鍵值,然后返回在符號的屬性列表中,與鍵值相關(guān)的數(shù)值:

> (get 'alizarin 'color)
NIL

它使用?eql?來比較各個鍵。若某個特定的屬性沒有找到時,?get?返回?nil?。

要將值與鍵關(guān)聯(lián)起來時,你可以使用?setf?及?get?:

> (setf (get 'alizarin 'color) 'red)
RED
> (get 'alizarin 'color)
RED

現(xiàn)在符號?alizarin?的?color?屬性是?red?。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號