1

おそらく、(<! 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 マクロ (その局所性) の制限も機能です。ステートフル操作のソース コードの局所性を強制します。」しかし、コードを強制的にローカライズすることは、「完全にする」ことと同じではありませんか?

4

1 に答える 1