今日は,『プログラミングGauche』の
- 16章 さまざまなデータ構造
- 17章 総称関数とオブジェクト
を読みました。
16章
本章の最後に出てくる「ストリーム」は難しいですが,不思議で面白いです。フィボナッチ数列は以下のように定義できるそうですが,
gosh> (use util.stream) #<undef> gosh> (define fib (stream-cons 0 (stream-cons 1 (stream-map + fib (stream-cdr fib))))) fib
なんだかよく分かりません。以下のように,streamを除いた,普通のcons, map, cdrで置き換えてあげると,
gosh> (cons 0 (cons 1 (map + '(0 1) (cdr '(0 1))))) (0 1 1) gosh> (cons 0 (cons 1 (map + '(0 1 1) (cdr '(0 1 1))))) (0 1 1 2) gosh> (cons 0 (cons 1 (map + '(0 1 1 2) (cdr '(0 1 1 2))))) (0 1 1 2 3)
フィボナッチ数列が出来上がるので,雰囲気はつかめたような気がします。しかし先の例で,fibは最初,'()だと思うので,以下のようなイメージかなとも思うのですが,以下のようにエラーがでます。cdrで失敗します。
gosh> (cons 0 (cons 1 (map + '() (cdr '())))) *** ERROR: pair required, but got ()
ということは,先にでてきたフィボナッチ数列の定義では,fibは最初,'(0 1)と考えるんでしょうか?