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