评论者:alexmiller
使用现有的async结构在ManyToManyChannel上实现IDeref和IBlockingDeref的概念性实现相对简单
`
(deftype ManyToManyChannel
...
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,因此这里存在循环依赖问题。解决这个问题的方法类似于查找delay后的var:
`
(def ^:private <!!' (delay (find-var 'clojure.core.async/<!!)))
;; 然后
IDeref
(deref [this] (@<!!' this))
`
但是,我有点不清楚如何处理类似alt!!的情况,它是do-alt和alts(image: )的宏。