如何在Clojure对象中找到已实现的协议?

Mau*_*ijk 10 clojure

是否有文档化的方法来查找Clojure对象实现的协议?另一种方式(显示给定协议扩展的类)很简单:(扩展程序协议).

Mau*_*ijk 6

我最终得到了以下实现:

(defn protocol? [maybe-p]
  (boolean (:on-interface maybe-p)))

(defn all-protocols []
  (filter #(protocol? @(val %)) (ns-publics *ns*)))

(defn implemented-protocols [sym]
  (filter #(satisfies? @(val %) sym) (all-protocols)))
Run Code Online (Sandbox Code Playgroud)

首先,它查找当前命名空间中的所有符号(当然,您可以将其扩展到所有命名空间),无论它们是协议定义还是网络(所有协议).接下来,如果满足其中一个协议,则查找给定符号.

协议?函数使用:on-interface键,没有记录afaik,所以这个函数不可移植.