评论者: alexmiller
在许多多通道中使用现有的异步结构来实现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依赖于clojure.core.async.impl.channels,因此这里存在循环依赖问题。通过查找delay后面的var,<!!和超时相对容易处理,如下所示
`
(def ^:private <!!' (delay (find-var 'clojure.core.async/<!!)))
;; 然后进行
IDeref
(deref [this] (@<!!' this))
`
然而,我在如何使用alt!!实现等效方案上有点困惑,它是一个围绕do-alt和alts(image: )的宏。