読者です 読者をやめる 読者になる 読者になる

Mae向きなブログ

Mae向きな日記のブログ版。ようやくこちらに移行してきました。

27章分の17章

今日は,『プログラミング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)と考えるんでしょうか?