列表作為慣例
某些語言包括列表資料結構。Common Lisp 和 Lisp 系列中的其他語言廣泛使用列表(Lisp 的名稱基於 LISt 處理器的思想)。但是,Common Lisp 實際上並不包含基本列表資料型別。相反,列表按慣例存在。該公約取決於兩個原則:
- 符號 nil 是空列表。
- 非空列表是一個 *cons 單元,*其 car 是列表的第一個元素,其 cdr 是列表的其餘部分。
這就是列表的全部內容。如果你已經閱讀了名為什麼是缺點單元格的示例*?*,那麼你知道汽車是 X 並且 cdr 是 Y 的 cons 單元可以寫成 (X.Y) 。這意味著我們可以根據上述原則編寫一些列表。元素 1,2 和 3 的列表很簡單:
(1 . (2 . (3 . nil)))
但是,由於列表在 Lisp 系列語言中非常常見,因此除了簡單的點對符號之外,還有特殊的列印約定。
- 符號 nil 也可以寫成 () 。
- 當一個 cons 單元的 cdr 是另一個列表( () 或者 cons 單元格時,不使用點對符號來寫一個 cons 單元,而是使用
list notation
。
列表符號通過幾個示例最清楚地顯示:
(x . (y . z)) === (x y . z)
(x . NIL) === (x)
(1 . (2 . NIL)) === (1 2)
(1 . ()) === (1)
這個想法是列表的元素在括號內按順序寫入,直到達到列表中的最後一個 cdr。如果最終的 cdr 為 nil (空列表),則寫入最後的括號。如果最終的 cdr 不是 nil (在這種情況下列表被稱為不正確的列表 ),則寫入一個點,然後寫入最終的 cdr。