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