ContinuationsにClojure
-
19-09-2019 - |
質問
を読んでどこかで豊かなヒッキー:
"と思いcontinuationsがっ 理論的にも実践"
になりつつありまclojure.
1.なclojureてcontinuations?
2.ない場合にはんだcontinuations?れによって多くの事例から 内容はこちらからご確認くださ.うの?
3.そしてあるので、書類?
解決
継続について話すとき、あなたはそれらの2つの異なる種類を区別する必要があります:
ファーストクラスの継続 - 言語に深く統合された継続サポート(スキームまたはルビー)。 Clojureは、ファーストクラスの継続をサポートしていません。
継続パススタイル(CPS) - CPSは単なるコーディングのスタイルであり、匿名関数をサポートする言語はこのスタイルを可能にします(これはClojureにも適用されます)。
例:
-- Standard function
double :: Int -> Int
double x = 2 * x
-- CPS-function – We pass the continuation explicitly
doubleCPS :: Int -> (Int -> res) -> res
doubleCPS x cont = cont (2 * x)
; Call
print (double 2)
; Call CPS: Continue execution with specified anonymous function
double 2 (\res -> print res)
読んだ 継続 ウィキペディアで。
良い言語には継続が必要ではないと思いますが、特にHaskellのような機能的言語での一流の継続とCPSは非常に便利です(インテリジェントなバックトラッキングの例).
他のヒント
ClojureポートオブCl-Contを作成しました。これは、一般的なLISPに継続を追加します。
継続は言語で必要な機能ですか?
いいえ。多くの言語には継続がありません。
いいえの場合、継続する必要はありませんか?私は特にこの男から多くの良い例を見てきました。代替案は何ですか?
コールスタック
抽象Continuations
Continuationsは抽象的な概念が用いられる制御フロー意味論。その意味で、その両方が存在し、存在しないという大きさでありながら抽象)言語るには、管理者として他のチューリングの完全な言語)と同じように、その数値の両方が存在して抽象的な存在として具体).
Continuationsの記述制御の効果などの関数呼び出/返し、例外を扱うもgotos.もの創語等によって生産された持ち上げられてcontinuations(例えば、例外).(とは言うものの、独自の言語の管理者がインフォメーションcontinuationsます。それは、もちろん、完全に合理的な用語なcontinuationsとしての のみ 制御抽象化可能であり、ユーザーは、自作の抽象化。)
初級Continuations
場の概念を継承する reified として第一級のオブジェクトの言語、そしてツールにすべての種類の制御効果ることは可能です。例えば、言語初級continuationsな例外を構築する事を目的としてい例外のcontinuations.
問題は第一級のContinuations
が第一級のcontinuationsは強力かつ有用なツールが多くある点に触れて、その言語:
- 異なる抽象化されてcontinuationsが予期せぬ/unintuitive挙動が構成されています。例えば、
finally
ブロックだけスキップされることを利用した場合、継続中断、計算機、などがあげられます。 - 現在の継続を求める場合がある時、その言語の実行時に必い構造を作製することができる一部のデータ構造の表現を、現在の継続。この場所にある程度の負担の実行時のための特徴は、は、良きにつけ悪しきにつけ、であると考えられることが多い"エキゾチック".の場合の言語の開催などClojureで開催のJVM)、その表現できることが必着枠組みでの提供を開催。が発生する可能性がありその他の言語のように維持(例えば、C interop)を制限する液空間です。などの課題これらの増加の可能性"をimpedenceミスマッチ"は、厳重複雑な開発のperformantます。
追加ラContinuations言語
を通じてmetaprogrammingできる追加支援のための初級continuationsました。一般的に、このアプローチを変えるコードを継続-通風(CPS)における現在の継続が経過程として明示的に引数に指定可能となっています。
例えば、デヴィッドのユニ delimc ライブラリを区切りcontinuationsの部分のClojureプログラムを通じてシリーズのマクロ変換.こうした認識の下、著 プーリーcps, であるマクロコンパイラに変換するコードをCPSとともに、実行時の図書館への支援によりコアClojure ーンなどの例外処理などinteropネイティブClojureます。
課題のひとつはこのアプローチをどう取り扱いは境界の間にネイティブ(Clojure)コード変換(CPS)のコードです。具体的には、できませんの継続のネイティブコードに必要なもののいずれかを許可又は何らかの制限)interopでは、ベース言語または負荷のユーザーの確保のできる任意継続を希望してい捕捉することで、実際に捉えられています。
プーリーcps傾向がある方、後者の方が試みられてきたユーザーを管理します。例えば、できる可CPSコードコネイティブコードです。また、機構への供給CPSバージョンの既存のネイティブ機能
言語を十分に強力タイプシステム(ウ)では、タイプシステムの封止計算が使用管理業務(continuations)から機能的に純粋なコードです。
概要
というのに必要な情報を直接お答えしつ
継続の一般的な使用は、関数から戻る、ループからの脱却、例外処理などの制御構造の実装にあります。ほとんどの言語(Java、C ++など)は、コア言語の一部としてこれらの機能を提供します。一部の言語はありません(例:スキーム)。代わりに、これらの言語は連続性をファーストクラスのオブジェクトとして公開し、プログラマーに新しい制御構造を定義させます。したがって、スキームは、それ自体が完全な言語ではなく、プログラミング言語ツールキットと見なされるべきです。
Clojureでは、ほとんどすべての制御構造が言語/VMの組み合わせによって提供されるため、継続を直接使用する必要はほとんどありません。それでも、ファーストクラスの継続は、有能なプログラマーの手の強力なツールになる可能性があります。特にスキームでは、継続は他の言語の同等のカウンターパートよりも優れています(CのSETJMP/LONGJMPペアなど)。 これ 記事には詳細があります。
ところで、リッチなヒッキーが継続についての彼の意見をどのように正当化するかを知ることは興味深いでしょう。そのためのリンクはありますか?
Clojure(またはむしろ clojure.contrib.monads
)継続的なモナドがあります。 これがその使用と動機を説明する記事です.
まあ... Clojure's ->
あなたが後にしているものを実装します...しかし、代わりにマクロで