おそらく、(<! c)
外部の go マクロを使用するための可能な解決策は、マクロとそのマクロ展開時間で実行できます。
これは私の例です:
(ns fourclojure.asynco
(require [clojure.core.async :as async :refer :all]))
(defmacro runtime--fn [the-fn the-value]
`(~the-fn ~the-value)
)
(defmacro call-fn [ the-fn]
`(runtime--fn ~the-fn (<! my-chan))
)
(def my-chan (chan))
(defn read-channel [the-fn]
(go
(loop []
(call-fn the-fn)
(recur)
)
))
(defn paint []
(put! my-chan "paint!")
)
そしてそれをテストするには:
(read-channel print)
(repeatedly 50 paint)
私はネストされたgoでこのソリューションを試しましたが、うまくいきます。しかし、それが正しい道であるかどうかはわかりません
この質問の理由は、この他の質問に関連しています 、@aeuhuea は、「これが単純さと構成可能性を妨げているように思えます。なぜ問題にならないのでしょうか?」とコメントしています。および @cgrand 応答「go マクロ (その局所性) の制限も機能です。ステートフル操作のソース コードの局所性を強制します。」しかし、コードを強制的にローカライズすることは、「完全にする」ことと同じではありませんか?