Powered by SmartDoc

list 処理の基本関数

list処理の基本関数は、歴史的な理由から奇妙な名前を持つ、次の三つの関数である。

car
listの先頭の要素を返す。この結果を元のlistの「car部」と呼ぶ。
cdr
listの先頭の要素を取り除いた残りの部分を返す。この結果を元のlistの「cdr部」と呼ぶ。
cons
二つの引数(二つ目はlist )を持ち、最初の引数をcar部、二つ目の引数をcdr部に持つlistを作る。

一般に、次の等式が成立する。但し、Lは任意のlist, Xは、任意のS-式である。

  1. (car (cons X L)) = X
  2. (cdr (cons X L)) = L
  3. (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]
次の入力を行い、どのような結果が表示されるかを確認しなさい。
  1. (car '(a b c))
  2. (car '(a))
  3. (car NIL)
  4. (car 'a)
  5. (car '(add 1 2))
  6. (car (add 1 2))
  7. (setq lst '(x y z))
  8. (car lst)
  1. xlispの場合、carにNILを与えるとNILになるようである。しかし、これは、一般のlispとは異なる振る舞いである。

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]
次の入力を行い、どのような結果が表示されるかを確認しなさい。
  1. (cdr '(a b c))
  2. (cdr '(a))
  3. (cdr NIL)
  4. (cdr 'a)
  5. (cdr '(add 1 2))
  6. (cdr (add 1 2))
  7. (setq lst '(x y z))
  8. (cdr lst)
[演習2.2.3]
carとcdrを用いて、次のような関数を定義しなさい。
  1. listの最初の要素を取り出す関数(つまりcarと同じ) first「(first '(a b c))の結果はa」
  2. listの二番目の要素を取り出す関数second「(second '(a b c))の結果はb」
  3. listの三番目の要素を取り出す関数third「(third '(a b c))の結果はc」
  1. xlispの場合、cdrにNILを与えるとNILになるようである。しかし、これは、一般のlispとは異なる振る舞いである。

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]
次の入力を行い、どのような結果が表示されるかを確認しなさい。
  1. (cons 'a '(b c))
  2. (cons 'a NIL)
  3. (cons '(a b c) '(d e f))
  4. (setq lst '(x y z))
  5. (car (cons 'a lst))
  6. (cdr (cons 'a lst))
  7. (cons (car lst) (cdr lst))
  8. (eq lst (cons (car lst) (cdr lst)))
  9. (equal lst (cons (car lst) (cdr lst)))
[演習2.2.5]
car, cdr, consを用いて次のような関数を定義
  1. 二つの引数を持ち、その二つの要素からなるlistを作るpair「(pair 'a 'b)の結果は(a b)」「(pair '(a b c) '(x y z))の結果は((a b c) (x y z))」
  2. 二つ以上の要素を持つlistの最初要素と二番目の要素を交換する関数exchange「(exchange '(a b c))の結果は(b a c)」なお、三つ目以降の要素の内容は変わらないものとする。
  1. 実は、consの第二引数は、listでなくてもかまわない。しかし、この演習では、consの第二引数にlist以外のものを指定する場合については、扱わない。詳しくは、専門書を参照のこと。