跳至內容

Lisp 入門/第三章 構造表

維基教科書,自由的教學讀本

第三章 構造表

[編輯]

CONS 操作符

[編輯]

我們剛剛學習了如何拆分一個表,現在學習如何合併一個表。 CONS 操作符就是做這件事情的。

假設有一個列表 (1 2 3) ,我們做一下 CAR 操作:

(car '(1 2 3))

返回 1 。

我們再做一下 CDR 操作:

(cdr '(1 2 3))

返回 (2 3) 。

CONS 操作符的作用就是將拆開的表連起來。

(cons 1 '(2 3))

返回的將是原來的列表 (1 2 3) 。


S 表達式

[編輯]

cons 操作符的第二個參數要是一個列表,才能返回一個列表。否則:

(cons 2 3)

返回

(2 . 3)

這次中間有一個點。為甚麼呢?

因為,表實際上是一個樹(二叉樹)。我們上面所用到的帶括號的式子被稱為 S表達式。而在S表達式中, 二叉樹在表示為 (Left . Right) 。

如果左支是一個表,則就會成為如下形式。

((List) . Right)

如果右支是一個表,當然也可以表示為 (Left . (List)) ,但是此時我們一般把點省略掉,寫成

(Left List)

你現在可能有些暈,用一段表達式表示就很清晰了,如下

'(3 . (2 3))

(3 2 3)

CONS操作符的作用是將兩棵樹連接成一棵樹。

那麼現在你能回答爲什麼CDR操作符會取出除第一個外的所有元素了嗎,因為它的實質是取二元樹的右支。



總之CONS操作符的作用是連接一個元素與一個表(順序不可顛倒)。

(cons 2 '(2 3))

(2 2 3)

如果要連接三個或以上的元素,要這樣

(cons 1 (cons 2 '(3)))

(1 2 3)

真正有點實質性的是這個式子

(cons 1 (cons 2 (cons 3 nil))) ;;; (1 2 3)

(cons 3 nil) ;;; (3)

如果二叉樹的右支是NIL,那麼連NIL都省略掉。如

'(3 . Nil) ;;; (3)

一件有趣的事情是這樣

(cdr '(3)) ;;; NIL

append 函數

[編輯]

append函數的作用是連接n個個表。

>(append '(3 3) '(4 4))
;; 将两个表连接
(3 3 4 4)

形象點說,它會把最外一層括號去掉,然後連接。比如

>(append '((3)) '(4 4))

((3) 4 4)

LIST 函數

[編輯]

LIST 函數的意義是將所有的參數放入一個表中並返回之。

>(list 1 1 1 1)

(1 1 1 1)

>(list '(2 3) '(2) 1 2)

((2 3) (2) 1 2)