Clojureには継続/コルーチン/などがありますか?


20

私はPythonでプログラミングを始めましたが、コルーチンやクロージャーなどの概念に本当に戸惑っていました。

今、私はそれらを表面的なレベルで知っていると思いますが、その「啓発」の瞬間を一度も感じたことがないので、Clojureを学ぶことにしました。私はスチュアート・ハロウェイの本を買ったが、それは良いが、インデックスを見ると、コルーチンや継続のような言葉はなかった。私はそれらをグーグルで検索しましたが、何もありません。

だから、私の質問は:

Clojureには、スタックオーバーフローなしでピンポンのようなタスクを実行するための継続またはコルーチンがありますか?

Pythonの例(標準のPythonは、この対称コルーチンの完全な機能を備えたバージョンをサポートしていません):

def ping():
  while 1:
   print "ping"
   function to switching to pong

def pong():
  while 1:
   function to switching to ping
   print "pong"

回答:


20

Clojureにはcall / ccはありませんが、とにかく無制限の継続は必要ありません。

他のcall/ccすべてをライブラリにネイティブに委任することを実装する際立った制御操作として、コア言語機能として反対します。プリミティブcall/ccは、以下に示す「悪い」のさまざまな意味で、悪い抽象概念であり、プログラム全体の継続のそのキャプチャは、実際には有用ではありません。継続全体を効率的にキャプチャするためのハードワークに対する唯一の報酬は、継続全体のキャプチャを回避するためのよりハードワークです。ユーザーと実装者の両方に、よく考えられた相互作用を備えたさまざまな一般性の適切に選択された制御プリミティブのセットが提供されます...

... call/cc他のすべての制御機能を実装するという点でコア制御機能として提供することは、悪い考えです。パフォーマンス、メモリおよびリソースのリーク、実装の容易さ、使いやすさ、推論のしやすさはすべて反論しcall/ccます。プリミティブとして実装する優れた制御機能が本当に1つあり、他の機能がライブラリに委ねられている場合は、そうではありませんcall/cc

David NolenはClojureの区切り付き継続ライブラリを作成しました。やってみて!

delimc

Clojure 1.4.0(および1.3.0)の区切り付き継続ライブラリ。Slava Akhmechet(http://defmacro.org)によるcl-contに基づく部分...


2

Clojureには、主要な機能としてファーストクラスの継続機能またはコルーチンが組み込まれていませんが、独自の機能を実装することは可能です。

たとえば、core.asyncはCSP(同時実行プロセス)モデルを実装するClojureライブラリです。goマクロを使用して、内部のコードをステートマシンに変換します。コルーチンそのものではありませんが、同じパターンを実装するために使用できます。

ありpulley.cps私は(を経由して変換することを執筆してきたマクロコンパイラ、cps/ cps-fnマクロ)Clojureのコードは継続渡しスタイルに直接的なスタイルで書かれては。私の知る限り、それは最も完全な継続テーマのClojureプログラムです。動的バインディング、例外、ネイティブコードと変換されたコード間のコールバックをサポートします(ただし、継続はコンテキスト間で維持されません)。現時点では、中途半端な継続(つまり、伝統的なcall-cc)のみがサポートされていますが、将来、区切られた継続を実装する計画があります。

プーリー.cpsはそれ自体コルーチンを直接提供しませんがcall-cc、独自のものを実装するのは比較的簡単です。実際、例の1つは、協調マルチタスクの単純な実装です。これは、CSPの例でさらに構築されています。ピンポンの例もありますが、コルーチンよりもテールコールの最適化の例です。

もちろん、これらの種類の変換は、プログラム全体に適用すると最も効果的です。残念ながら、これはローカライズされたマクロだけでは不可能です。それでも、ローカライズされた変換でさえ非常に効果的です。


1

Clojureには、スタックオーバーフローなしでピンポンのようなタスクを実行するための継続またはコルーチンがありますか?

古い質問ですので、この機能がその時点で利用可能だったかどうかはわかりませんが、「ピンポン」機能を実装したい人はトランポリンをチェックしてください!

Clojureの効率的なContinuation-Passing Styleに関する質問への回答としてここで発見しました。https//stackoverflow.com/questions/50952443/continuation-passing-style-does-not-seem-to-make-a -difference-in-clojure / 50955276#50955276 と私はそれがちょうど仕事だと思います。少し前にそれについて聞いたことがありますが、完全に調査したことはありません。もっと私をだます。他の多くの提案されたソリューションとは異なり、それはただ機能します。

====== PS。オンラインのチュートリアル情報のロード、]ここに私が便利だと思ったいくつかがあります


1
多分ドキュメントを指すようにトランポリンをリンクしますか?
esoterik
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.