Wie finde ich implementierte Protokolle im Clojure-Objekt?

9

Gibt es eine dokumentierte Möglichkeit zu finden, welche Protokolle von einem Clojure-Objekt implementiert werden? Andersherum (zeigen Sie, für welche Klassen ein bestimmtes Protokoll erweitert wird) ist einfach: (Extenders Protokoll).

    
Maurits Rijk 10.01.2011, 21:35
quelle

2 Antworten

5

Ich endete mit der folgenden Implementierung:

%Vor%

Zuerst sucht es nach allen Symbolen im aktuellen Namespace (Sie können dies natürlich auf alle Namespaces ausweiten), egal ob es sich um Protokolldefinitionen oder um Net (alle Protokolle) handelt. Als nächstes sucht es nach einem gegebenen Symbol, wenn es eines dieser Protokolle erfüllt.

Das Protokoll? Funktion verwendet die: On-Interface-Taste, die nicht dokumentiert ist afaik, so dass diese Funktion nicht tragbar ist.

    
Maurits Rijk 13.01.2011, 19:49
quelle
0

Ich kann das momentan nicht ausprobieren, aber vielleicht möchten Sie die Java-Klassenmethode ausprobieren: getGenericInterfaces . Dies sollte Ihnen eine Liste von Schnittstellen geben. Es gibt wahrscheinlich andere Möglichkeiten, diese Informationen mit ähnlichen Methoden zu erhalten, aber ich habe nicht gesucht.

Wenn Sie sich auch den Quellcode ansehen, sehen Sie, wie Protokolle eingerichtet werden (Sie können zur Quelle gelangen, indem Sie auf die Links in der clojure API klicken). In Clojure 1.3 gibt es eine 'private' Funktion, die so aussieht:

%Vor%

Diese Funktion wird von Clojures Funktion extend verwendet, um zu überprüfen, ob Sie tatsächlich ein Protokoll bereitgestellt haben. Wenn Sie Ihre eigene Funktion so machen, können Sie die Ergebnisse von getGenericInterfaces filtern. Da dies ein internes Detail ist, kann es Änderungen unterliegen.

    
hutch 11.01.2011 12:22
quelle

Tags und Links