也许可以使用(<! c)
宏及其宏扩展时间来完成使用外部宏的可能解决方案:
这是我的例子:
(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)
我已经在嵌套中尝试过这个解决方案并且也可以工作。但我不确定它是否是正确的路径
这个问题的原因与另一个问题有关core.async 是否违反了 Clojure 原则?,@aeuhuea 评论说:“在我看来,这阻碍了简单性和可组合性。为什么这不是问题?” 和@cgrand 响应“go 宏(它的局部性)的限制也是一个特性:它强制执行有状态操作的源代码局部性。” 但是强制本地化您的代码与“完成”不同吗?