問題タブ [continuations]

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.

0 投票する
12 に答える
9374 参照

c - 継続を実装する方法は?

私はCで書かれたSchemeインタープリターに取り組んでいます。現在、Cランタイムスタックを独自のスタックとして使用していますが、継続の実装に小さな問題があります。私の現在の解決策は、Cスタックをヒープに手動でコピーし、必要に応じてコピーして戻すことです。標準 C ではないことを除けば、このソリューションは理想的とは言えません。

CでSchemeの継続を​​実装する最も簡単な方法は何ですか?

0 投票する
12 に答える
2972 参照

ruby - 継続の「実際の」使用例を探す

私は継続の概念を理解しようとしていますが、ウィキペディアの記事から、このようないくつかの小さな教育の例を見つけました:

この小さな関数が何をするかは理解できますが、明確な用途は見当たりません。近いうちにコード全体で継続を使用する予定はありませんが、継続が適切な場合がいくつかあることを知りたいと思います。

だから私は、継続がプログラマーとして私に提供できるものについて、より明示的に有用なコードサンプルを探しています。

乾杯!

0 投票する
9 に答える
3063 参照

functional-programming - 継続が取れない!

それらは何であり、何に適していますか?

私はCSの学位を持っておらず、私の経歴はVB6-> ASP->ASP.NET/C#です。誰かがそれを明確かつ簡潔に説明できますか?

0 投票する
4 に答える
3462 参照

ruby - Ruby での継続

Ruby に継続を行わせる作業を行った人はいますか (Smalltalk の Seaside のように)。

0 投票する
1 に答える
938 参照

smalltalk - Seaside 継続の操作

Squeak で BlockClosure を取得するにはどうすればよいですか (BlockClosure>>callCC を使用したい)?

BlockContext である [#foo] を書くとどうなりますか?

更新: BlockClosure は主に新しいコンパイラのものであることがわかりました。

代わりに、海辺の継続をどのように扱うのですか? 私は問題を抱えています。例を教えていただければ幸いです。

さらなる更新: これの目的は、海辺を (少なくとも直接ではなく) 使用することではなく、独自の状態追跡イテレーターをローリングするよりも簡単な方法でトラバーサルなどを記述することです。

0 投票する
2 に答える
1553 参照

c# - C# でのイベント ベースの非同期。一般的なリファクタリングは可能ですか?

WebClient などの一部の API は、イベント ベースの非同期パターンを使用します。これは単純に見え、疎結合のアプリ (UI の BackgroundWorker など) ではうまく機能する可能性がありますが、連鎖はあまりうまくいきません。

たとえば、非同期処理がブロックされないようにマルチスレッド化されたプログラムを次に示します。(これがサーバー アプリで行われ、何百回も呼び出されると想像してください。ThreadPool スレッドをブロックしたくありません。) 3 つのローカル変数 (「状態」) を取得し、2 つの非同期呼び出しを行い、その結果を最初に2番目のリクエストにフィードします(したがって、それらは並行して進むことができません)。状態も変化する可能性があります (簡単に追加できます)。

WebClient を使用すると、次のようになります (または、クロージャーのように動作するオブジェクトの束を作成することになります)。

}

このイベントベースの非同期パターンをリファクタリングする一般的な方法はありますか? (つまり、このような API ごとに詳細な拡張メソッドを記述する必要はありませんか?) BeginXXX と EndXXX を使用すると簡単ですが、このイベントの方法では方法がないようです。

0 投票する
4 に答える
1128 参照

functional-programming - ポータブル継続をサポートする高速言語はありますか?

ポータブル継続をサポートする高速言語(つまり、ネイティブにコンパイルしてCの3倍または4倍以下のパフォーマンスを実現できる言語)を探しています。これは、あるコンピューターでシリアル化でき、別のコンピューターで逆シリアル化できる継続を意味します。

SISCがこれ(JavaでのSchemeの実装)を実行できることは知っていますが、速度は遅くなります。Rhinoの同上(JavaでのJavascript実装)。

0 投票する
5 に答える
2042 参照

python - Ruby での継続に相当する Python

Ruby の次のコードに相当する Python は何ですか?

参照:軽量開発成功の秘訣、パート 9: 継続ベースのフレームワーク

0 投票する
7 に答える
2657 参照

python - プログラムで Python スタック フレームを構築し、コード内の任意のポイントで実行を開始することは可能ですか?

CPython でスタック (1 つまたは複数のスタック フレーム) をプログラムで構築し、任意のコード ポイントで実行を開始することは可能ですか? 次のシナリオを想像してください。

  1. ワークフロー エンジンへの呼び出しであるいくつかの構造 (分岐、待機/結合など) を使用して Python でワークフローをスクリプト化できるワークフロー エンジンがあります。

  2. wait や join などのブロッキング呼び出しは、ある種の永続的なバッキング ストアを使用して、イベント ディスパッチ エンジンでリスナー条件を設定します。

  3. エンジンで待機条件を呼び出し、後で通知される条件を待機するワークフロー スクリプトがあります。これにより、イベント ディスパッチ エンジンにリスナーが設定されます。

  4. ワークフロー スクリプトの状態、関連するスタック フレーム (プログラム カウンター (または同等の状態) を含む) は、数日後または数か月後に待機状態が発生する可能性があるため、保持されます。

  5. その間に、ワークフロー エンジンが停止され、再起動される可能性があります。つまり、ワークフロー スクリプトのコンテキストをプログラムで保存および再構築できる必要があります。

  6. イベント ディスパッチ エンジンは、待機条件がピックアップするイベントを発生させます。

  7. ワークフロー エンジンは、シリアル化された状態とスタックを読み取り、スタックを使用してスレッドを再構築します。次に、待機サービスが呼び出された時点で実行を継続します。

質問

これは、変更されていない Python インタープリターで実行できますか? さらに良いことに、この種のことをカバーする可能性のあるドキュメント、またはプログラムでスタック フレームを構築し、コード ブロックの途中で実行を開始するコードの例を誰かに教えてもらえますか?

編集:「変更されていない python インタープリター」を明確にするために、C API を使用してもかまいません (これを行うには PyThreadState に十分な情報がありますか?) が、Python インタープリターの内部を調べて、変更されたものを構築します。

更新:最初の調査から、実行コンテキストを取得できますPyThreadState_Get()。これは、のスタック フレームへの参照を持つPyThreadState(で定義された)のスレッド状態を返します。スタック フレームは、 で定義されている にtypedef された構造体に保持されます。 コードブロックの先頭からのオフセットとして表されるプログラムカウンターを持つフィールド(bobinceへの小道具)があります。pystate.hframePyFrameObjectframeobject.hPyFrameObjectf_lasti

これは、実際にコンパイルされたコード ブロックを保持している限り、必要な数のスタック フレームのローカルを再構築し、コードを再起動できることを意味するため、一種の朗報です。これは、変更された python インターペレタを作成しなくても理論的には可能であることを意味すると思いますが、コードはおそらく、インタープリタの特定のバージョンに厄介で緊密に結合される可能性があることを意味します。

残る問題は次の3つです。

  • トランザクション状態と 'saga' ロールバック。これは、O/R マッパーを構築するために使用するメタクラス ハッキングのようなものによっておそらく達成できます。私は一度プロトタイプを作成したので、これがどのように達成されるかについてかなりのアイデアを持っています.

  • トランザクション状態と任意のローカルを堅牢にシリアル化します。これは、読み取り__locals__(スタック フレームから利用可能) と、pickle への呼び出しをプログラムで作成することによって実現できます。ただし、ここに何があるのか​​ わかりません。

  • ワークフローのバージョン管理とアップグレード。システムはワークフロー ノードのシンボリック アンカーを提供していないため、これはやや複雑です。これを行うには、すべてのエントリ ポイントのオフセットを特定し、それらを新しいバージョンにマップする必要があります。おそらく手動で行うことは可能ですが、自動化するのは難しいと思います。この機能をサポートしたい場合、これがおそらく最大の障害になります。

更新 2: PyCodeObject ( code.h) には addr ( f_lasti)-> 行番号マッピングのリストがありPyCodeObject.co_lnotabます (ここで間違っている場合は訂正してください)。これは、ワークフローを新しいバージョンに更新するための移行プロセスを容易にするために使用される場合があります。これは、凍結された命令ポインターを新しいスクリプトの適切な場所にマップし、行番号に関して行うことができるためです。まだかなり面倒ですが、もう少し有望です。

更新 3:これに対する答えはStackless Python かもしれません。 タスクを一時停止してシリアル化できます。これがスタックでも機能するかどうかはわかりません。