在 Clojure 中,如何检查一个对象是否是 core.async 通道?

In Clojure, how to check if an object is a core.async channel?

有一个函数chan可以创建频道。但是我没有看到 chan?。 对于 chan 创建的对象,我将如何编写一个谓词 chan? returns 为真?

我问的是 Clojure 和 ClojureScript。

因为频道是 implemented as:

(deftype ManyToManyChannel [^LinkedList takes ^LinkedList puts ^Queue buf closed ^Lock mutex add!]
   ...)

您可以检查它是否是 ManyToManyChannel:

的实例
(import [clojure.core.async.impl.channels ManyToManyChannel])

(instance? ManyToManyChannel obj)

或者,如果您更关心协议而不是类型本身,您可以检查对象 satisfies? 是否属于协议:

(satisfies? clojure.core.async.impl.protocols/WritePort
            obj)