Common Lisp/基礎主題/列表
外觀
< Common Lisp | 基本主題
- 本模組尚未完成。歡迎改進。
列表在 Common Lisp 中由稱為cons 單元的配對構成。每個單元有兩個部分,歷史上稱為 car(第一部分)和 cdr(其餘部分)。
(car . cdr)
列表透過讓第一個單元的 cdr 指向另一個 cons 單元來使用 cons 單元實現。
空列表也稱為 nil,它的書面表示形式是 nil 本身或空列表:()。
您可以使用 cons 建立一個列表,以構造一個具有左右部分的新 cons 單元。
(cons 'a '()) ⇒ (A)
(cons 'a '(b)) ⇒ (A B)
(cons 'a (cons 'b (cons 'c nil))) ⇒ (A B C)
請記住,可以建立不是列表的 cons 單元。
(cons 'a 'b) ⇒ (A . B)
這被稱為點分列表。為了成為一個正確的列表,cons 單元鏈中的最後一個 cdr 必須指向空列表 (nil)。您也可以使用函式list建立列表
(list 'a 'b 'c) ⇒ (A B C)
等效於
(cons 'a (cons 'b (cons 'c '()))) ⇒ (A B C)
(cons 'a (cons 'b (cons 'c nil))) ⇒ (A B C)
(cons 'a '(b c)) ⇒ (A B C)
'(a b c) ⇒ (A B C)
您可以使用函式car(或first)和cdr(或rest)訪問列表的成員。
(setf list '(a b c))
(car list) ⇒ a
(first list) ⇒ a
(cdr list) ⇒ (b c)
(rest list) ⇒ (b c)
Common Lisp 還定義了函式second、third 和fourth(一直到tenth)。請注意,second與cdr或rest不同。cdr和rest都返回第一個元素之後的剩餘列表,而second返回列表中的第二個元素。
(rest list) ⇒ (b c)
(second list) ⇒ b
(third list) ⇒ c
(fourth list) ⇒ nil
列表是序列,因此對序列進行操作的函式也對列表進行操作。
(subseq list 0 1) ⇒ (a)
(subseq list 0 2) ⇒ (a b)
函式nth還允許您從列表中檢索選定的元素。
(nth 0 list) ⇒ a
請注意,列表中的第一個元素是第 0 個。Common Lisp 還有幾種用於操作列表內容的形式(函式和宏)。mapcar 可用於一次處理列表中的每個元素,以構建新的列表。
(defun add2 (n)
(+ 2 n))
(mapcar #'add2 '(1 2 3)) ⇒ (3 4 5)
在該示例中,我們正在對單個列表進行對映,因此我們使用了一元函式(一個引數的函式)。該#'是將函式作為引數傳遞給函式的一種特殊方式。我們將在下一章中詳細討論它。也可以對多個列表進行對映 - 函式必須與列表的數量具有相同的引數個數。
(mapcar #'+ '(1 2 3) '(4 5 6)) ⇒ (5 7 9)