[Gauche-devel-jp] It's a bad lazy eval on 32bit machine, isn't it?

アーカイブの一覧に戻る

katsutoshi ito itou.****@rens*****
2004年 2月 23日 (月) 12:06:24 JST


伊東です。

具体的にコード示してないのですが。。。
#理由は最後に分るって事で・・・(-.-;;)

あんまり関係ないと思いますけど一応環境は NetBSD 1.6 で gosh 0.7.4.1 です。
pentium 4 2.0GHz 主記憶 1G DDR-SDRAM が載ってるマシンです。

やりたかったことは 0 1 の二値で 0 〜 (2^n)-1 までの二進パターンをリストで生成するってのです。
#それを使って次のステップがあるんだけどそれ以前の話。

(generate-pattern 3)
  => ((0 0 0) (0 0 1) (0 1 0) (0 1 1) (1 0 0) (1 0 1) (1 1 0) (1 1 1))

って感じが基本。
つまり 2^n の二進表示になる全パターンのリストを生成する。
内部的には 2 の n 乗を計算して 2 で割りながら余りをリストに cons していくことで一つ一つ
のパターンを生成する。つまり 2 進数に変換してリストにしただけの作り方です。

で、これだと当然 (generate-pattern 40) とかやるとメモリ不足でおしまいなんで、lazy なタイプへ作りなおして、 

(generate-pattern 3)
  => ((0 0 0) . #<promise 0x***>)

な形にしたわけです。実際要求される値は50〜60位までは十分ありうるだろうということで。

SICP にならって (pattern-ref obj n) って感じでこのストリームの n 番目の要素を
取り出せるようにして、

(define p (generate-pattern 100)) ;; 2^100 のパターンのストリーム
(pattern-ref p 1) => (0 0 0 .... 0) ;; OK
(pattern-ref p 2) => (0 0 0 .... 1) ;; OK
(pattern-ref p (^ 2 99)) => ??? ;; 2^99 番目のパターンを取得。。。

とやりました。
ここで (^ x n) は x の n 乗を計算するオペレータです。
これは確か

(define (^ x n)
  (if (= n 0)
      1
      (* x (^ x (- n 1)))))

って感じのアタリ前の書き方だったと思います。

ここで、非常にあいまいな質問になるので、まぁ回答が返って来ない可能性大かもしれないですが・・・

この様なプログラムは generate-pattern や pattern-ref がちゃんとしたプログラムになってれば
32bit マシン上で問題なく動作するのでしょうか?

実は上記のポイントまでコードを組んでて (pattern-ref p 1) とか (pattern-ref p 2) では
さくさく動いてたのですが、(pattern-ref p (^ 2 99) とやると走り出して止まらなくなっちゃいました。
lazy でないやつであれば (generate-pattern 40) をしたところですぐ gosh が死んだはず。
やはり2^100 ってでかすぎたんだろうか?順番にたどるだけでも長い?

ただ、それが単に計算してるなぁって状態ではなく、他の terminal も選べないし gnome の
プルダウンメニューなども反応しない。

仕方なく外からプロセスを殺してやろうと思ったのですが、完全に応答が無くなってしまって他の terminal を
選択することすら出来ないので、強制的に X を Ctrl+Alt+BS で落としたのですが、それもプロンプトが戻ってこない。

神に祈りながら電源 OFF ・・・再起動・・・あらら、きっちりかっとんじゃいました。
まぁ、HD の replace や CD-RW/DVD-ROM の増設などしたかった状態でずっとタイミングを逸してたので
この機会にってことで前向きに気を取り直して

  H/W いじいじ => OS の 再インストールついでに Ver UP => 現在生活環境を準備中。。。

てわけで一切コードも残ってない状態です。
いや、作成中だったいくつかも C コードは残ってたんだけど scheme などの script の類は全滅。。。

何を見誤っているのかな?っと思い返しているところです。
それは無理だろうでも良いですし、ちゃんとしたコードで動きますよ〜でもいいのですが
なんかコメントありましたら是非お願いします。

以上



Gauche-devel-jp メーリングリストの案内
アーカイブの一覧に戻る