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