Esiste un modo documentato per trovare quali protocolli sono implementati da un oggetto Clojure? Il contrario (mostrare per quali classi un determinato protocollo è esteso) è semplice: (protocollo degli estensori).Come trovo i protocolli implementati nell'oggetto Clojure?
risposta
ho finito con la seguente implementazione:
(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)))
In primo luogo sembra per tutti i simboli nello spazio dei nomi corrente (si può ovviamente estenderà a tutti i namespace) se sono definizioni di protocolli o net (tutti Protocols). Successivamente cerca un dato simbolo se soddisfa uno di questi protocolli.
Il protocollo? la funzione utilizza la: chiave on-interface che non è documentata, quindi questa funzione non è portabile.
Al momento non riesco a provare questo, ma si potrebbe voler provare il metodo di classe Java: getGenericInterfaces
. Questo dovrebbe darti un elenco di interfacce. Ci sono probabilmente altri modi per ottenere queste informazioni usando metodi simili ma non ho guardato.
Se si guarda anche il codice sorgente, vedremo come vengono configurati i protocolli (è possibile ottenere il codice sorgente facendo clic sui collegamenti nell'api del clojure). In Clojure 1.3 v'è una funzione di 'privato' che assomiglia a questo:
(defn- protocol?
[maybe-p]
(boolean (:on-interface maybe-p)))
Questa funzione viene utilizzata dalla funzione di Clojure extend
per verificare che hai effettivamente fornito un protocollo. Se si esegue la propria funzione in questo modo è possibile filtrare i risultati di getGenericInterfaces
. Poiché questo è un dettaglio interno potrebbe essere soggetto a modifiche.
getGenericInterfaces restituisce (clojure.lang.IObj clojure.lang.ILookup clojure.lang.IKeywordLookup clojure.lang.IPersistentMap java.util.Map java.io.Serializable) ma non il protocollo implementato. Credo che dovrò approfondire il codice sorgente per vedere come è fatto. –
Sono appena tornato alla mia macchina, e non ho intenzione di andare oltre. Probabilmente è più semplice usare 'getInterfaces' come alternativa ragionevole a' getGenericInterfaces'. Mi chiedo cosa succederà se tu compili la cosa. – hutch
Parte del punto dei protocolli è che una classe non ha bisogno di implementare un'interfaccia per estendere un protocollo: è possibile definire il proprio protocollo e quindi dire che alcune classi preesistenti lo estendono con '(estendi ExistingClass MyProtocol ...)'. Quindi è naturale avere un modo per chiedere "quali classi estendono questo protocollo" ma non un modo per porre la domanda inversa. –
- 1. Differenza tra protocolli Clojure e categorie Groovy
- 2. Implementazione di strutture dati personalizzate mediante protocolli Clojure
- 3. Ambiente spedizione dipendente di protocolli/multimethods in clojure
- 4. Come vengono implementati i tipi di membri?
- 5. Come vengono implementati i riferimenti deboli?
- 6. Come vengono implementati i blocchi try/catch?
- 7. Come vengono implementati i parser DOM?
- 8. Come vengono implementati i C# Generics?
- 9. Come vengono implementati i canali Go?
- 10. Perché i protocolli Objective-c adottano altri protocolli?
- 11. Dove implementare i protocolli Swift?
- 12. stoccaggio estensione Swift per i protocolli
- 13. Come vengono implementati i vtables in C++ e C#?
- 14. Come sono implementati i flussi pigri in Java 8?
- 15. I membri std :: forward_list possono essere implementati come statici?
- 16. Come vengono implementati i comandi incorporati nella shell?
- 17. Come vengono implementati i riferimenti nella JVM di Oracle?
- 18. Come vengono implementati i turni a livello hardware?
- 19. Come vengono implementati i test di chat di Facebook?
- 20. Come vengono implementati i valori opzionali in Swift?
- 21. NSNotificationCenter vs delegation (utilizzando i protocolli)?
- 22. Come trovo l'interprete rubino?
- 23. Come generare automaticamente stub per i protocolli in XCode 4.2?
- 24. I protocolli stateless sono considerati meglio da utilizzare su protocolli stateful?
- 25. Dove trovo i registri di System.out.println()?
- 26. Come vengono implementati gli array in Perl?
- 27. Come sono stati implementati "diecimila centesimi"?
- 28. Come trovo i pacchetti definiti in un barattolo?
- 29. Rails: come trovo() tutti i record univoci in determinati campi?
- 30. Come trovo tutti i punti in un percorso in Android?
'protocollo?' Fallisce su una mappa ordinata, almeno in Clojure 1.8. Vedi [questa domanda] (http://stackoverflow.com/q/37410580/1393162). –