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: (Extender-Protokoll).Wie finde ich implementierte Protokolle in Clojure-Objekt?
Antwort
endete ich mit der folgenden Implementierung bis:
(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)))
Zuerst sieht es für alle Symbole im aktuellen Namensraum (Sie natürlich dies für alle Namensräume erweitern können), ob sie Protokolldefinitionen oder net sind (alle -Protokolle). 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, also diese Funktion ist nicht tragbar.
Ich kann dies derzeit nicht wirklich versuchen, aber Sie könnten versuchen, die Java-Klassenmethode: 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 wie folgt aussieht:
(defn- protocol?
[maybe-p]
(boolean (:on-interface maybe-p)))
Diese Funktion wird durch die Clojure extend
Funktion verwendet wird, um zu überprüfen, dass Sie tatsächlich ein Protokoll zur Verfügung gestellt 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 geben.
getGenericInterfaces gibt mir (clojure.lang.IObj clojure.lang.ILookup clojure.lang.IKeywordLookup clojure.lang.IPersistentMap java.util.Map java.io.Serializable) aber nicht das implementierte Protokoll. Ich denke, ich muss mich in den Quellcode vertiefen, um zu sehen, wie es gemacht wird. –
Bin gerade zurück zu meiner Maschine, und ich komme nicht weiter als du bist. Es ist wahrscheinlich einfacher, getInterfaces als eine vernünftige Alternative zu getGenericInterfaces zu verwenden. Ich frage mich, was passiert, wenn Sie das Ding kompilieren. – hutch
Teil der Protokollen ist, dass eine Klasse keine Schnittstelle implementieren muss, um ein Protokoll zu erweitern: Sie können Ihr eigenes Protokoll definieren und dann sagen, dass eine bereits existierende Klasse es erweitert mit '(extend ExistingClass MyProtocol ...)'. Daher ist es naheliegend, zu fragen, "welche Klassen dieses Protokoll erweitern", aber keine Möglichkeit, die umgekehrte Frage zu stellen. –
- 1. Automatisch implementierte Eigenschaften in C#
- 2. Wie kann ich überprüfen Oozie Protokolle
- 3. Azure: Wo finde ich die Protokolle meiner Rolle, wenn ich Remote Desktop verwende?
- 4. Wie sehe ich Protokolle auf Parse-Server?
- 5. Wie finde ich Methodenaufrufe?
- 6. Wie erstelle ich automatisch implementierte Eigenschaften im VS Klassen Designer
- 7. Wie finde ich Verbindungslecks?
- 8. Wo finde ich mysql logs in phpmyadmin?
- 9. Wie finde ich find_module?
- 10. Automatisch implementierte Eigenschaften Problem
- 11. Wie sammle ich Protokolle von cloudbasierten Diensten?
- 12. xsd.exe Automatisch implementierte Eigenschaften
- 13. Wie finde ich Text in [] in Sed?
- 14. Umwandlung in nicht implementierte Schnittstelle kompiliert
- 15. Wie finde ich eine Datei in einem Subversion-Repository-Verlauf?
- 16. Wie verschiebe ich Protokolle von der Konsole in eine Datei?
- 17. Achtung: Nicht implementierte Selector localizedCaseInsensitiveCompare
- 18. Wie finde ich folgende Daten
- 19. Wie finde ich das Datumsformat?
- 20. Wie finde ich welchen Objekttyp in Perl?
- 21. Wie finde ich Unicode-Zeichen in antlr
- 22. Wie finde ich alle Erweiterungsmethoden in Lösung?
- 23. Wie finde ich eine Datei in Project?
- 24. Wie finde ich einen Breakpoint in C#?
- 25. Wie finde ich rekursiv in Verzeichnissen
- 26. Wie finde ich Anführungszeichen in Strings - Python
- 27. Wie finde ich den Variablentyp in JavaScript?
- 28. Wie finde ich Duplikate in einer Zeichenfolge?
- 29. Wie finde ich diese Webadresse in node.js?
- 30. Wie finde ich am besten in r?
'Protokoll?' Scheitert auf einer sortierten Karte, zumindest in Clojure 1.8. Siehe [diese Frage] (http://stackoverflow.com/q/37410580/1393162). –