タグ付けされた質問 「continuation」

2
Yコンビネーターとテールコールの最適化
F#のYコンビネーターの定義は let rec y f x = f (y f) x fは、最初の引数として、再帰的サブ問題の継続を期待しています。yfを継続として使用すると、fが次の呼び出しに適用され、開発できることがわかります。 let y f x = f (y f) x = f (f (y f)) x = f (f (f (y f))) x etc... 問題は、先験的に、このスキームがテールコールの最適化を使用できないことです。実際、fで保留中の操作がある可能性があります。その場合、fに関連付けられたローカルスタックフレームを変更できません。 そう : 一方では、Yコンビネータを使用するには、関数自体とは明示的に異なる継続が必要です。 TCOを適用する必要がある場合は、fで保留中の操作はなく、f自体のみを呼び出します。 これら2つを調整する方法を知っていますか?アキュムレータトリックを使用したYや、CPSトリックを使用したYなど?それともそれができる方法がないことを証明する議論?

3
関数呼び出しのセマンティクスを表すためにスタックを使用する代替策はどれですか?
通常、関数呼び出しは通常スタックを使用して実装されることを知っています。フレーム、リターンアドレス、パラメータ、ロットがあります。 ただし、スタックは実装の詳細です:呼び出し規則は異なることを行う場合があります(x86 fastcallは(一部の)レジスタを使用し、MIPSとフォロワーはレジスタウィンドウを使用するなど)、最適化は他のこと(インライン化、フレームポインターの省略、テールコール最適化..)。 確かに、多くのマシン(JVMやCLRのようなVMだけでなく、PUSH / POPなどを備えたx86のような実際のマシン)に便利なスタック命令が存在するため、関数呼び出しに使用すると便利ですが、場合によっては可能ですコールスタックが不要な方法でプログラムする(ここでContinuation Passing Style、またはメッセージパッシングシステムのアクターについて考えています) だから、私は疑問に思い始めていました:スタックなしで関数呼び出しセマンティクスを実装することは可能ですか、それとも異なるデータ構造(キュー、おそらく、または連想マップ)を使用して良いですか? もちろん、スタックは非常に便利な(ユビキタスである理由があります)が、最近私は不思議に思う実装にぶつかりました。 言語/マシン/仮想マシンで行われたことがあるかどうか、知っている人はいますか?その場合、顕著な違いと欠点はどれですか? 編集:私の直感は、異なるサブ計算アプローチが異なるデータ構造を使用できるということです。たとえば、ラムダ計算はスタックベースではありません(関数の適用の考え方は簡約によってキャプチャされます)が、実際の言語/マシン/例を見ていました。それが私が尋ねている理由です...

2
手順として実装されていない継続の例は何ですか?
SOに関するコールバックと継続の区別に関する興味深い議論がこの質問を促しました。定義上、継続とは、計算を完了するために必要なロジックの抽象的な表現です。ほとんどの言語では、これは継続的な処理が必要な値を渡す1つの引数プロシージャとして現れます。 純粋に関数型の言語(すべての関数が純粋でファーストクラスの市民である場合)では、継続は関数として完全にモデル化できると思います。これは、結局のところ、これまでの継続を私が以前に理解していた方法です。ただし、世界は状態(ため息)でいっぱいです。したがって、一般的な定義では、継続がプログラムの状態をキャプチャする必要はありません。 私の理解を助けるために、継続が関数よりも抽象的な方法で表現されている関数型言語で例を提供できますか?Schemeを使用すると、現在の継続をファーストクラスの方法(call / cc)で取得できることはわかっていますが、それでも、call / ccに渡される1つの引数プロシージャには、現在の継続が別の形式で与えられているようですcall / cc'd関数が結果を適用できる引数手続き。

1
ファーストクラスの継続は、最新のオブジェクト指向プログラミング言語で役立ちますか?
継続はCont、命令型コードの単純で規則的な表記を可能にするため、関数型プログラミング言語(Haskell のモナドなど)では非常に便利です。また、欠落している言語機能(例外、コルーチン、グリーンスレッドなど)の実装に使用できるため、一部の古い命令型言語でも役立ちます。しかし、これらの機能のために建てられたサポート付きのモダンなオブジェクト指向言語のためにも(かどうか、より現代的なスタイル区切られたファーストクラスの継続のためのサポートを追加するためにどのような引数があるだろうresetとshiftか、スキームのようなcall-with-current-continuation)? パフォーマンスと実装の複雑さ以外のサポートを追加することに反対する議論はありますか?

4
継続/コールバックを読みやすいコードにするにはどうすればよいですか?
概要:非同期コードとコールバックを使用しているにもかかわらず、コードを読みやすくするために使用できる、確立されたベストプラクティスのパターンはありますか? 非同期に多くのことを行い、コールバックに大きく依存するJavaScriptライブラリを使用しています。単純な "load A、load B、..."メソッドを書くのはかなり複雑になり、このパターンを使用するのは難しいようです。 (不自然な)例を挙げましょう。リモートWebサーバーから一連の画像を(非同期で)ロードしたいとします。C#/ asyncでは、次のように記述します。 disableStartButton(); foreach (myData in myRepository) { var result = await LoadImageAsync("http://my/server/GetImage?" + myData.Id); if (result.Success) { myData.Image = result.Data; } else { write("error loading Image " + myData.Id); return; } } write("success"); enableStartButton(); コードレイアウトは「イベントのフロー」に従います。最初に、開始ボタンが無効になり、次に画像が読み込まれ(awaitUIの応答性が維持されます)、その後、開始ボタンが再び有効になります。 JavaScriptでは、コールバックを使用して、これを思いつきました: disableStartButton(); var count = myRepository.length; function loadImage(i) { …

7
ネストされたループ内から「続行」するためのベストプラクティスは?
これは簡略化されたサンプルです。基本的に、文字列リストから文字列をチェックします。チェックにパスすると、その文字列(filterStringOut(i);)が削除され、他のチェックを続行する必要がなくなります。したがってcontinue、次の文字列に。 void ParsingTools::filterStrings(QStringList &sl) { /* Filter string list */ QString s; for (int i=0; i<sl.length(); i++) { s = sl.at(i); // Improper length, remove if (s.length() != m_Length) { filterStringOut(i); continue; // Once removed, can move on to the next string } // Lacks a substring, remove for (int …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.