Replies: 14 comments
-
|
ありがとうございます。 |
Beta Was this translation helpful? Give feedback.
-
|
Beta Was this translation helpful? Give feedback.
-
|
Beta Was this translation helpful? Give feedback.
-
|
Beta Was this translation helpful? Give feedback.
-
|
Beta Was this translation helpful? Give feedback.
-
|
すいません、変なことを書きました。 そちらでの対応は、(当然ですが) 一切不要です。 こちらは、変更前のコミットに対して、ある程度作業をして、 ご迷惑をおかけしました。 |
Beta Was this translation helpful? Give feedback.
-
|
metacontinuationを使ってcontinuation frameをsegmented にするのとresetChainを消すのはずっと前からのアイディアで、こちらを先に解決してからこの上にHamayamaさんのアイディアを順に乗せていこうと思ってたんですが(実際、作業中です)、事前に相談して進めるべきでしたね。申し訳ないです。 |
Beta Was this translation helpful? Give feedback.
-
|
ScmMetaCont 導入からのコミットをmetacontinuationブランチに移して、masterの方はそれ以前の状態に戻しました。 parameterとexceptionHandlerチェインについてはDENVで解決すべきで、現状こんがらがってるのはrewindの方に問題がある (rewindは本来abort系のプリミティブに全て任せるべき)、と考えているんですがどうでしょう。exceptionHandlerのリストを部分継続が「切り取る」というのは本来想定されているセマンティクスではないと思うんですが。 (訂正)exceptionHandlerじゃなくてdyamic handlersだ。 |
Beta Was this translation helpful? Give feedback.
-
|
いろいろとお手数おかけしております。 しばらくダウンしていました。 Revert 前のソースで、私が確認して NG だったテストは、 #1263 の最初のコメントにある、 (2) は、Algebraic Effects という有名なもので、 (3) は、Oleg 先生のサイトに載っている ただ、Racket でも meta-continuation に、ホスト (Chez) の continuation は、 |
Beta Was this translation helpful? Give feedback.
-
この件ですが、私が最初にはまったのが、 あと、(p 3) のようにしてパラメータを変更できてしまう件もあって、
exception handler は、現状は DENV の中にチェーンが入っていて、 dynamic handlers は、現状は DENV には入っていなくて (キーは予約されていますが) 、 「切り取る」というか、各 meta-continuation が自分の担当分だけを記憶する 基本的に、「つかんで戻る」という処理を全部捨てないと、 そして、これが本当に良いものなのかというのが、私にはあやしく思える。 特に、タグによるたすきがけが、制御構造として複雑すぎる気がする。 |
Beta Was this translation helpful? Give feedback.
-
|
現在のmetacontinuationブランチでは(2)のGauche-effectsテストは全部通ります。(3)はリークしますね… |
Beta Was this translation helpful? Give feedback.
-
|
あー、リークするのはmetacontによるsegmented cont frame化を完全に完了してないからだな。 |
Beta Was this translation helpful? Give feedback.
-
|
(3) のリークは、#1263 では、 同様に、DENV(=continuation-mark), prameter, dynamic handler, exception hadler そして、それらができたとして、最後にラスボスのような仕様があり、それが、 このようにして実装していくと、既存の call/cc との競合が目に見えるようになります。 というあたりがこれまでたどったルートです。 |
Beta Was this translation helpful? Give feedback.
-
|
metacontのアイディアは、cont->prevのチェインをpromptでNULLにして切って(segmented)、metacontのチェインの方に各segmentのつながりを持たせる、というものです。(partcont-metaの実装はオリジナルのcall/ccを基礎にmetacontを作っているのでチェインの切断ができていません)。実装が完了すれば、call/ccで取った継続も、ぶつ切りのチェインがmetacontで繋がれた形になります。 もともと最初のGaucheの部分継続実装が、resetでcont->prevをNULLにして、returnで戻ってきてprevがNULLだったら「直近に保存された継続」から再開する、というものでした (ドキュメントの部分継続の説明はその時のままです)。ただこれだとプロンプトが複数あった場合にうまくありません。 segmented continuation chainの場合、contフレーム自体は継続の起動の際に変更されるところがないので、一旦ヒープに移したら起動の際にコピーしなおす必要がありません。metacont chainの方はつなぎ直さないとならないのでコピーが必要ですが、データ量はずっと少ないです。 denvのalistも今は前のdenvフレームとは独立しています (srfi-226参照実装でmetacontinuationが空のmarksで初期化されるのと同じ。ただ、Gaucheではparametersやexception handlersチェインもdenvに入れていて、それはトラバースを楽にするために前のdenvフレームの値を持ってきてる。これがリークに影響を与えるかもしれない)。 |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
しばらく、部分継続の実行を (ep->cont に戻るのではなく)
vm->cont に追加する形にできないか試していたのですが、
難しいようです。
現状の、戻るタイプの部分継続の実行では、
promptTag がない reset / shift のみであれば、
何とかつじつまを合わせることができるのですが、
promptTag があると、対応ができません。
例えば、
のようなケースで、(k1) の実行では、k2 は、
(B) の方の reset-at との間を切り取らねばなりません。
しかし、戻るタイプの部分継続の実行では、
(A) の方の reset-at との間を切り取ってしまいます。
結果として、(k2) の実行で、
[r03] が表示される/されないの違いが出ます。
Add call-with-composable-continuation experimentally #1259 では、
promptTag のサーチは、追加するタイプの部分継続で行い、
実際の部分継続の実行は、戻るタイプの継続のままにするという、
ハイブリッドな形で、かなりのテストを通すことはできました。
しかし、prompt-at / control-at を実装しようとすると、
部分継続の実行時に、より奥の promptTag まで実行する必要があるため、
どうしても実現できませんでした。
それに、仕組みも複雑になってしまったので、後々の保守を考えても厳しいように思います。
現状の Gauche では、部分継続の切り取りと追加をしようとした場合に、
つなぎめの部分の処理をうまく書くことができませんでした。
ひとつのハードルが、DENV で、
戻る場合には DENV をごっそり捨てられるというのは分かるのですが、
部分継続の切り取りと追加をしようとした場合に、
中にある情報をある継続点まで切り取って保存したり、
それを別な継続に追加することが困難なようにみえました。
また他のハードルのひとつが、ループ時のメモリリークで、
だいたい、ep や resetChain でつかまえた情報が解放されなくて発生するようでした。
これは、つかまえた情報を削っていくと直ることが多かった。
(最初、Scm_VMPushCC() を使ったら末尾再帰でなくなるのでだめなのかと思ったのですが、
それは関係なかった)
他のハードルのひとつが、戻るタイプの例外処理との組み合わせで、
guard や call/cc と部分継続の実行を組み合わせた場合に、
無限ループになったり SEGV したりしました。
またリベンジしたいですが、しばらくは休もうかと・・・
Beta Was this translation helpful? Give feedback.
All reactions