评论来自:alexmiller
使用现有的async构造在ManyToManyChannel中使用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))
`
然而,我有点难以处理alt!!的类似实现,它是一个围绕do-alt和alts(image: )的宏。