由 alexmiller 发表的评论:
在 ManyToManyChannel 上使用现有 async 构造实现 IDeref 和 IBlockingDeref 的概念性实现相对简单
`
(deftype ManyToManyChannel
#_existing_code...
IDeref
(deref [this] (<!! this))
IBlockingDeref
(deref [this ms timeoutValue]
(alt!!
this ([val _] val)
(timeout ms) timeoutValue)))
`
然而,M2MC 在 clojure.core.async.impl.channels 中定义。<!!, alt(image: ), 和 timeout 都在 clojure.core.async 中定义,这依赖于 clojure.core.async.impl.channels,因此这里存在循环依赖问题。处理 <!! 和 timeouts 相对简单,可以通过查找 delay 后的 var 如此实现
`
(def ^:private <!!' (delay (find-var 'clojure.core.async/<!!)))
;; 然后
IDeref
(deref [this] (@<!!' this))
`
然而,我在如何处理 do-alt 和 alts(image: ) 的宏 alt!! 方面感到有些困惑。