#stream -> generator -> lseq とつなげれば遅延シーケンスに変換できますね。性能上のオーバヘッドは増えますが。streamとlseqの違いは、遅延構造であることが明示されるか暗黙に処理されるかってことなので、それぞれ必要な場合に応じて使い分ければ良いと思います。
#もうひとつ、特殊なケースですが、(eof-object)を要素の一つとしてあつかうときにはstreamでやるしかないですね。これが意味のあるケースかどうかはよくわかりません。解釈次第では、(eof-object)を抜いてしまえばいいとも言える。
#もしくは、generatorを生成するstreamと解釈するとか?
#まあそうです。「データ終端」がデータの集合に含まれていると、データ終端をデータとして含むデータ列が表現できないので、eof-objectの存在は理屈の上ではあまり綺麗ではありません。Common Lispではそれを嫌ったのか、データ列の終端を別の方法で扱います。型がある言語では一段ラップしてやれば良い話なのですが、動的型言語で取れる手法は (1)特別扱いのオブジェクト(Scheme式), (2)callerに指定させる(CL式)、(3)例外を使ってout-of-boundな情報として通知、くらいかな。
#リーダーのR7RS対応。少なくともstrict R7RS, R7RS+gauche拡張, gauche後方互換のモードが必要だがモード切り替えを考えてたらこの機会にreadtableを入れてしまう方がすっきりする気がしてきた。
#「なんでも再帰」の記事ですが、コメント欄がないのでここに書きます。
##例8の記事コードが例9だと思うのですが、例8では in-space でカウンタを増やしているのに、例9では in-word で増やしています。例9は間違っているように思うのですが、いかがでしょうか?
#あと、僕が書いている「再帰ドリル」で、この記事の相互再帰の例を使いたいと思っているのですが、よろしいでしょうか?
##2011-06-20 - 健康優良無職
http://d.hatena.ne.jp/ayatoy/20110620
#部分継続とdynamic-windのことが書いてあるのですが、ひょっとしてparameterizeno
#のこともこれに関係があるのでしょうか?
##>kazuさん、 その通りです。記事を書き進めながらコード例をちょいちょい直していたせいかと。例はどうぞお使いください。
#>yamasushiさん、まさにそのバグです。コメントしてたんですが案外面倒で放置になってました。でも今見てるんですが実はそんなに面倒で無かったかもしれないような気もしているのでうまく直せたら近いうちにコミットします。
#Scheme:generatorとdoとwhile
http://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3agenerator%e3%81%a8do%e3%81%a8while
#ここのこととも関係があるのかしら?とか・・・・
#それは関係ないような。今回のはあくまで「call/ccではちゃんと動いているdynamic-windとの相互作用が、shift/resetでは動いてなかった」って話です。shift/resetをcall/ccを使って書けば(遅くなるけど)動くはず。
#ありがとうございます。
#wilikiにあるgeneratorを試してみたのですけれど、https://gist.github.com/yamasushi/5530823 (x),(x)のようにすると動いて、(generator->list x)をやると()が返ってくるのです。(dynamic windとは別件ですが・・・) #このwilikiにある実装に、もうひと工夫が必要ということでしょうか?
#ありゃほんとだ。妙だなあ。
#ああ妙じゃないか。こうじゃないですか https://gist.github.com/shirok/5530942 eof-objectを返すところに注目。 #そうでした。なるほど。継続の使い方が身についていないようです。ありがとうございます。
#test.scm
https://gist.github.com/yamasushi/5530972
#>gosh /home/shuji/gauche/debug/test.scm
#?="/home/shuji/gauche/debug/test.scm":26:(rp-dict)
#?- "hoge"
*** ERROR: attempt to return from a ghost continuation.
Stack Trace:
#このコードをlseqをつかわずに、generator->listでやると動いているようです。
#上に挙げたwilikiのdynamic-windとcall/ccについてのことと関係があるのかなあと。(内容はむずかしくて、よくわからんのですが)
##?=($ generator->lseq $ generator-generate (^y (y 1) ) )
あ、どうもこれがまずいみたいです。dynamic-windとは関係ないです。
##lseq変換は、call/ccをつかうとダメということなのでしょうか?
#むー。それは今まで気づかなかった問題ですね。lseqのlazy部の評価時に暗黙のresetが使われるから、それ以前に補足した継続が呼び出せない、ということかな。もうちょい検討してみないとよくわかりません。
##この論文が関係あるのかしら?とか・・・ 情報学広場:情報処理学会電子図書館
http://id.nii.ac.jp/1001/00016497/