問題タブ [callcc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
scheme - 次の call/cc 式を実行します
私はラケットを使用4
し、次の単純なコードの結果を得ました。
このコードを段階的に実行するつもりでした。
まず、最初のものを次のようなlet/cc
形式に変更しました。call/cc
もちろん、これ4
も生産します。
第二に、私は次の4つのステップを行うcall/cc
というインターネットのメカニズムを見つけたので:call/cc
- 現在の継続をキャプチャします。
- 引数を 1 つ取る関数を構築し、
C
その引数値で現在の継続を適用します。 - この関数を引数として
expr
--- に渡します。つまり、 を呼び出します(expr C)
。 - を呼び出さ
(expr C)
ない限り、 を評価した結果を返します。この場合、に渡された値が返されます。expr
C
C
したがって、最初のcall/cc
ように上記の手順に従いました。
- 現在の継続はアイデンティティです。
C
を指し(λ (x) x)
ます。
/li>expr
であるため(λ (done) ((let/cc esc (done (+ 1 (let/cc k (esc k))))) 3))
、次の(expr C)
とおりです。上記のコードの結果値を返すために、racket で上記を実行します。
ただし、上記のコード (私が変更) は実行されず、エラーが発生します。
私が間違ったことをしてください。私は継続の概念を混乱させています。ありがとう。
ruby - Ruby でヒープをチェックポイントして復元する
Rubycallcc
は現在の継続をキャプチャします。これを後で呼び出してコントロールを復元できますが、データは復元できません。現在の記憶のイメージとともに、現在の続きを捉えたいと思います。
ヒープをキャプチャすることはそれほど難しくないように思えます。ObjectSpace::each_object
とObjectSpace::dump_all
、またはMarshal.dump
、または単にに頼ることができますObject.clone
。ただし、ヒープを復元する簡単な方法はわかりません。理想的には、object_id -> object
マップをトラバースして、すべてのオブジェクトの古いイメージを復元します(対応するオブジェクトが GC されていobject_id
た場合は再度追加します)。object_id
当然のことながら、これを可能にする Ruby レベルの API はありません。私が使用できる Ruby の GC への低レベルのフックがあるかどうか疑問に思っています。
代替アプローチに関する提案を含め、どんな助けも大歓迎です。
javascript - 継続モナドで使用するためのエスケープ継続メカニズムを提供するように callcc を適用する方法
継続渡しスタイルと非同期制御フローを処理するために、Javascript で継続モナドを実装しようとしています。学習のための継続モナドは次のとおりです。
を除いてcont.ap
、その利点は私には明らかになりませんが、すべて正常に動作します。
ここで、Javascript の同期制御フローのthrow
/メカニズムを模倣したいと思います。http://hackage.haskell.org/に記載されているように、継続モナドで使用するためのエスケープ継続メカニズムを提供するため、適合しているようです。catch
callcc
しかし、申請方法がcallcc
わかりませんし、そのような申請について説明している適切な情報源も見つかりませんでした。