Schemeでリストを使用する

※ 以下はScheme初心者である私の勉強用のメモです。

間違っている可能性がありますので注意してください。

リスト

 最後が空リストで終わっているペアをリストという。


> (cons 1 (cons 2 (cons 3 ())))

リストを生成する

 リストはlist式を使用することで簡単に生成することができる。

一般形

(list 式1 式2 ・・・ 式n)

> (list 1 2 3)
(1 2 3)
> (list (+ 1 2) (* 3 4) 5)
(3 12 5)
> (list (list 1 2) (list 3 4 5)) ;入れ子になったリスト
(( 1 2) (3 4 5))
> (list ) ;空リスト
()

(list 1 2 3 4)は以下の式で記述することもできる。

> '(1 2 3 4)
(1 2 3 4)

 要素が一つもない空リストは(list )の他に以下の式で作成できる。

> '()
()
> ()
()

リストの操作を行う

前述したとおり、リストはペアの連続によって作られる。したがって、ペアを操作する関数でリストを操作することができる。

例 (car)

> (car '(1 2 3 4))
1
> (car (list '(1 2) 3 4))
(1 2)
> (car '(Hello world))
hello

;取り出す要素がない場合はエラーとなる
> (car '())
car: expects argument of type <pair>; given ()

例 (cdr)

> (cdr '(1 2 3 4))
(2 3 4)
> (cdr (list '(1 2) 3 4))
(3 4)
> (cdr '(Hello world))
(world)

;carと同じで取り出す要素がない場合はエラーとなる
> (cdr '())
cdr: expects argument of type <pair>; given ()

例 (cons)

> (cons 0 '(1 2 3 4))
(0 1 2 3 4)
> (cons '(1 2) '(3 4))
((1 2) 3 4)

carとcdrの組み合わせ

 carとcdrの組み合わせにより、任意の場所の要素を取り出すことができる。

> (car (cdr (cdr '(1 2 3 4 5)))) ;3番目の要素を取り出す
3

 Schemeには、carとcdrを組み合わせた動作を行う関数が多数用意されている。
例えば上記のように3番目の要素を取り出したい場合は、以下のような関数を使用することもできる。

> (caddr '(1 2 3 4 5)) ;3番目の要素を取り出す
3