42

多くの Clojure プログラマーが新しい core.async ライブラリに熱狂しているのを見てきました。非常に興味深いように思えますが、Clojure の原則にどのように準拠しているかを理解するのに苦労しているため、次の質問があります。

  1. 関数名が示すように、alt!、put!、>! などのように感嘆符が付けられているため、どこでも変更可能な状態を使用します。チャネルから値を入力または取得すると、そのチャネルはその場で変更されます。不変のデータ構造や純粋な関数などを好むという Clojure の哲学に反していませんか? それとも、変更可能なものをまったく回避できない場合にのみ、core.async を使用するように作られていますか?
  2. 「go」はマクロ(したがってコード構造を変更する)であり、「<!」を保証するためです。go-block で直接使用する場合、"<!" を使用することはできません。次のように、別の関数内で:

    (defn take-and-print [c]
     (println (<! c)))
    
    (def ch (chan 1))
    (>!! ch 123)
    
    (go (take-and-print ch))
    
    Assert failed: <! used not in (go ...) block
    

    これが単純さと構成可能性を妨げているように私には思えます。問題にならないのはなぜですか?

  3. おそらく、前の 2 つの問題の結果として、core.async を使用する多くのコードで、map/filter/reduce の代わりに loop/recur などの下位レベルの構造が使用されています。一歩後退じゃない?

ポイントがどこにありませんか?

前もって感謝します。

4

6 に答える 6

16

go マクロ (その局所性) の制限も機能の 1 つです。これは、ステートフル操作のソース コードの局所性を強制します。

于 2013-08-14T14:50:06.153 に答える
5

Rich Hickey は、blip.tv の講義の 1 つで、Clojure は「85% 機能する」と述べました。私は、core.async を残りの 15% の一部と見なしたいと考えています。Core.async は、promise、delay などによって行われる可能性が高い、より厄介な方法で行われるであろう、他のものの中での堅実なユーザー インタラクションに最適です。

于 2013-08-13T09:16:01.080 に答える