list 処理の基本関数
list処理の基本関数は、歴史的な理由から奇妙な名前を持つ、次の三つの関数である。
-
car
-
listの先頭の要素を返す。この結果を元のlistの「car部」と呼ぶ。
-
cdr
-
listの先頭の要素を取り除いた残りの部分を返す。この結果を元のlistの「cdr部」と呼ぶ。
-
cons
-
二つの引数(二つ目はlist )を持ち、最初の引数をcar部、二つ目の引数をcdr部に持つlistを作る。
一般に、次の等式が成立する。但し、Lは任意のlist, Xは、任意のS-式である。
- (car (cons X L)) = X
- (cdr (cons X L)) = L
- (cons (car L) (cdr L)) = L
car
carは、NIL以外のlistを引数とし、そのlistの要素先頭の要素を値として返す。
別の言い方をすれば、関数carは、listのcar部を返す関数である。
carの引数はNILでないlistである必要がある。carにatomを与えた場合は、一般にエラーとなる(34)。
List 処理関数 car
> (car '(x y z))
X
> (car '( (1 2 3) (4 5 6) (7 8 9) ) )
(1 2 3)
> (car (car '( (1 2 3) (4 5 6) (7 8 9) ) ))
1
>
-
[演習2.2.1]
-
次の入力を行い、どのような結果が表示されるかを確認しなさい。
- (car '(a b c))
- (car '(a))
- (car NIL)
- (car 'a)
- (car '(add 1 2))
- (car (add 1 2))
- (setq lst '(x y z))
- (car lst)
cdr
cdrは、NIL以外のlistを引数とし、そのlistの要素先頭の要素を取り除いた、残りの部分を値として返す。
別の言い方をすれば、関数cdrは、listのcdr部を返す関数である。
cdrの引数はNILでないlistである必要がある。cdrにatomを与えた場合は、一般にエラーとなる。(35)
cdrの結果は、一般にlistになることに注意しよう。
List 処理関数 cdr
> (cdr '(x y z))
(Y Z)
> (cdr '( (1 2 3) (4 5 6) (7 8 9) ) )
((4 5 6) (7 8 9))
> (cdr (cdr '( (1 2 3) (4 5 6) (7 8 9) ) ))
((7 8 9))
>
-
[演習2.2.2]
-
次の入力を行い、どのような結果が表示されるかを確認しなさい。
- (cdr '(a b c))
- (cdr '(a))
- (cdr NIL)
- (cdr 'a)
- (cdr '(add 1 2))
- (cdr (add 1 2))
- (setq lst '(x y z))
- (cdr lst)
-
[演習2.2.3]
-
carとcdrを用いて、次のような関数を定義しなさい。
- listの最初の要素を取り出す関数(つまりcarと同じ) first「(first '(a b c))の結果はa」
- listの二番目の要素を取り出す関数second「(second '(a b c))の結果はb」
- listの三番目の要素を取り出す関数third「(third '(a b c))の結果はc」
cons
consは、二つの引数を持ち、二つ目の引数は、一般にlistである(36)。
consは、一つ目の引数がcar部、二つ目の引数がcdr部となるようなlistを返す。
List 処理関数 cons
> (cons 'a '(x y z))
(A X Y Z)
> (cons '(a b c) '(x y z) )
((A B C) X Y Z)
> (cons (car '(1 2 3)) (cdr '(1 2 3)))
(1 2 3)
> (cons 'a NIL)
(A)
>
-
[演習2.2.4]
-
次の入力を行い、どのような結果が表示されるかを確認しなさい。
- (cons 'a '(b c))
- (cons 'a NIL)
- (cons '(a b c) '(d e f))
- (setq lst '(x y z))
- (car (cons 'a lst))
- (cdr (cons 'a lst))
- (cons (car lst) (cdr lst))
- (eq lst (cons (car lst) (cdr lst)))
- (equal lst (cons (car lst) (cdr lst)))
-
[演習2.2.5]
-
car, cdr, consを用いて次のような関数を定義
- 二つの引数を持ち、その二つの要素からなるlistを作るpair「(pair 'a 'b)の結果は(a b)」「(pair '(a b c) '(x y z))の結果は((a b c) (x y z))」
- 二つ以上の要素を持つlistの最初要素と二番目の要素を交換する関数exchange「(exchange '(a b c))の結果は(b a c)」なお、三つ目以降の要素の内容は変わらないものとする。