リストの基本操作
car
- リストの先頭の要素を返す
12:user> (car '(1 2 3 4)) => 1
「'」を付けとかないとプログラムとして見なされて、データとしては使えないので注意が必要。
cdr
- 先頭を除いた要素を返す
- 一つしかないと空リストを返す
- 空リストを適用するとエラー
0:user> (cdr '(1 2 3 4)) => (2 3 4) 1:user> (cdr '()) *** ERROR: pair required, but got () 1:user> (cdr '(1)) => () 2:user>
cons
- 先頭要素と残りの要素からなるリストをくっつけてリストにする
6:user> (cons 2 '(1 2 3)) => (2 1 2 3)
これはおk。
7:user> (cons '(1 2 3) '(1 2 3)) => ((1 2 3) 1 2 3)
これは思った通りにはならなかった。これはどういうリストなんだろう?ネストしリストか。
9:user> (list 1 2 3 4) => (1 2 3 4)
listという関数を使えばこういうのができる。
12:user> (list 1 2 3 4 '(1 2 3)) => (1 2 3 4 (1 2 3))
list関数内でネスト(?)させてもいいらしい。
consにリストじゃないものを与える
普通はこう。
16:user> (cons 1 '(2)) => (1 2)
でも、リストじゃないのを与えると、ドット対というものが登場する。
15:user> (cons 1 2) => (1 . 2)
andとかor
- andとかorも演算子とかじゃなくって手続きらしい
(and (pair? '(1 2 1)) (null? '()))
リストの走査
fold
何じゃこりゃ。
34:user> (fold + 0 '(1 2 3 4 5)) => 15
ふむ。
(fold <手続き> <初期値> <リスト>)
というのが構文で、リストの要素を順に処理していくのがfold。じゃあ、これで階乗か。
36:user> (fold * 1 '(2 3 4 5)) => 120
と思ったら本では関数として定義されていた。
(define (product-of-numbers lis) (fold * 1 lis))
として
38:user> (product-of-numbers '(1 2 3 4 5))) => 120
>手続きとif手続き
例見てればいいかな。
46:user> (> 6 3) => #t 47:user> (> 2 3) => #f 48:user> (if (> 6 1) 9 1) => 9