Lisp 入門/第三章 構造表
< 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)