多くの Clojure プログラマーが新しい core.async ライブラリに熱狂しているのを見てきました。非常に興味深いように思えますが、Clojure の原則にどのように準拠しているかを理解するのに苦労しているため、次の質問があります。
- 関数名が示すように、alt!、put!、>! などのように感嘆符が付けられているため、どこでも変更可能な状態を使用します。チャネルから値を入力または取得すると、そのチャネルはその場で変更されます。不変のデータ構造や純粋な関数などを好むという Clojure の哲学に反していませんか? それとも、変更可能なものをまったく回避できない場合にのみ、core.async を使用するように作られていますか?
「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
これが単純さと構成可能性を妨げているように私には思えます。問題にならないのはなぜですか?
おそらく、前の 2 つの問題の結果として、core.async を使用する多くのコードで、map/filter/reduce の代わりに loop/recur などの下位レベルの構造が使用されています。一歩後退じゃない?
ポイントがどこにありませんか?
前もって感謝します。