6章リスト

リストの基本操作

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