评论者:alexmiller
在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和timeout都在clojure.core.async中定义,这依赖于clojure.core.async.impl.channels,因此这里存在循环依赖问题。<!!和超时处理起来相对简单,可以通过查找如下延迟后的var来实现
`
(def ^:private <!!' (delay (find-var 'clojure.core.async/<!!)))
;; 然后
IDeref
(deref [this] (@<!!' this))
`
但是,我不太清楚如何用类似的alt!!来实现,它是一个围绕do-alt和alts!!的宏。