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)