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

Rob*_*b N 3 clojure clojurescript core.async

有一个chan创建频道的功能。但我没有看到chan?. 我将如何编写一个谓词chan?为由创建的对象返回 true chan?

我在询问 Clojure 和 ClojureScript。

Car*_*ate 8

由于通道实现为:

(deftype ManyToManyChannel [^LinkedList takes ^LinkedList puts ^Queue buf closed ^Lock mutex add!]
   ...)
Run Code Online (Sandbox Code Playgroud)

你可以检查它是否是一个实例ManyToManyChannel:

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

(instance? ManyToManyChannel obj)
Run Code Online (Sandbox Code Playgroud)

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

(satisfies? clojure.core.async.impl.protocols/WritePort
            obj)
Run Code Online (Sandbox Code Playgroud)