跳轉到內容

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 還定義了函式secondthirdfourth(一直到tenth)。請注意,secondcdrrest不同。cdrrest都返回第一個元素之後的剩餘列表,而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)
華夏公益教科書