- shiro
Olegさんの論文を見ると動的限定継続で静的限定継続を表現することはできるが、そのことを知らないで無制限に動的限定継続を使ってるコードと組み合わせるとダメなような気がする。それとも動的環境?をうまく管理してやれば回避できるんかいな。
- shiro
私もジェネレータの方をフルの継続を使ってやってみたんですがうまくない。一度フルの継続を使ってhttp-getから抜けた段階で「http-getの中で捕まえた部分継続」を起動すると、その部分継続の終わった先が「プログラム全体を囲む暗黙のreset」につながってしまうため、プログラムが終了してるのかな。部分継続はあくまで動的に「その時点でのreset」につながるため、他の手段でスタックをいじられてると望んだresetのところに戻ってこないってことだと思います。「このresetに戻ってくるはず」と決め打ちする使い方が間違ってるっぽい。
部分継続の中には切り取る底を明示できるものがあるので、そういうのを導入しないとならないような気がします。
- yamasushi
(use gauche.generator) (use gauche.parameter) (define rp-dict (make-parameter #f)) (let1 obj ($ generator->lseq $ generate (^y (y 1)) ) (parameterize ( [rp-dict "hoge" ] ) #?=(rp-dict) (write obj) (flush) #?=(rp-dict) ) ) # >gosh /home/shuji/gauche/debug/test.scm #?="/home/shuji/gauche/debug/test.scm":8:(rp-dict) #?- "hoge" (1)#?="/home/shuji/gauche/debug/test.scm":10:(rp-dict) #?- #f >Exit code: 02013/05/05 05:32:42 UTC
- shiro
>yamasushi (write obj)のところで一旦動的環境を抜けるのでrp-dictがリセットされて、そこからyieldして戻ってきた時にbefore thunkが実行されてないっぽいですね。
- yamasushi
2011-06-20 - 健康優良無職
http://d.hatena.ne.jp/ayatoy/20110620
部分継続とdynamic-windのことが書いてあるのですが、ひょっとしてparameterizeno のこともこれに関係があるのでしょうか?
わたしのところでも、そのブログと同じような結果になりました。
https://gist.github.com/yamasushi/5530699
2013/05/07 06:51:34 UTC
- shiro
>yamasushiさん、まさにそのバグです。コメントしてたんですが案外面倒で放置になってました。でも今見てるんですが実はそんなに面倒で無かったかもしれないような気もしているのでうまく直せたら近いうちにコミットします。
Tags: 動的環境, 部分継続, gauche.partcont, parameterize
Post a comment