评论由:alexmiller 提供
在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和timeout都定义在clojure.core.async中,而clojure.core.async依赖于clojure.core.async.impl.channels,因此这里存在循环依赖问题。处理<!!和超时的方法相对简单,可以通过查找delay后面的符号如下
`
(def ^:private <!!' (delay (find-var 'clojure.core.async/<!!)))
;;然后
IDeref
(deref [this] (@<!!' this))
`
然而,对于alt!!,我在如何实现等效方面有些困惑,它是一个围绕do-alt和alts!!的宏。