列表作為慣例

某些語言包括列表資料結構。Common Lisp 和 Lisp 系列中的其他語言廣泛使用列表(Lisp 的名稱基於 LISt 處理器的思想)。但是,Common Lisp 實際上並不包含基本列表資料型別。相反,列表按慣例存在。該公約取決於兩個原則:

  1. 符號 nil 是空列表。
  2. 非空列表是一個 *cons 單元,*其 car 是列表的第一個元素,其 cdr 是列表的其餘部分。

這就是列表的全部內容。如果你已經閱讀了名為什麼是缺點單元格的示例*?*,那麼你知道汽車是 X 並且 cdr 是 Y 的 cons 單元可以寫成 (X.Y) 。這意味著我們可以根據上述原則編寫一些列表。元素 1,2 和 3 的列表很簡單:

(1 . (2 . (3 . nil)))

但是,由於列表在 Lisp 系列語言中非常常見,因此除了簡單的點對符號之外,還有特殊的列印約定。

  1. 符號 nil 也可以寫成 ()
  2. 當一個 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。