Nachdem ich kürzlich eine Präsentation von Clojure-Protokollen gesehen habe, war ich ziemlich beeindruckt von der sauberen Art und Weise, mit der Erweiterungen bestehender Typen auf diese Weise durchgeführt werden können. Ich war mir jedoch ziemlich sicher, dass ich bereits eine ähnliche Methode in einer anderen Sprache gesehen hatte und nach einiger Zeit fand ich heraus, dass es Groovy Categories war.
Vergleiche das:
%Vor%zum Clojure-Protokoll-Äquivalent (übernommen von mikers Antwort unten und getestet in ideone.com )
%Vor%meine Frage ist:
Disclaimer: Ich bin ein kompletter Clojure-Neuling!
Hier ist der ungefähre äquivalente Clojure-Code unter Verwendung von Protokollen:
%Vor%Die wichtigsten Unterschiede, die es bei Clojure-Protokollen zu beachten gilt (was meines Erachtens von der Version der Groovy-Kategorien unterscheidet)
lower
für die Arbeit an einem Seil definieren. lower
ist eine korrekte First-Class-Funktion. Sie können damit Abstraktionen höherer Ordnung (über Funktionen höherer Ordnung) aufbauen, die wiederum alle Argumente akzeptieren, für die das Protokoll LowLearable erweitert wurde. Clojure-Protokolle sind eigentlich eine ziemlich einzigartige Lösung für das Expression Problem (verlinktes Video ist ziemlich interessant) . Ich denke, dass das nächste Äquivalent zu Clojure-Protokollen in einer anderen Sprache tatsächlich Haskell-Klassen sind. Selbst dann ist es ein bisschen schwierig, da Haskell statisch getippt ist und Clojure dynamisch typisiert wird ...
Die Clojure-Funktion, auf die er sich bezieht, sieht so aus:
%Vor%Implementierungen können für jeden Typ jederzeit hinzugefügt werden - es gibt keine Notwendigkeit für die beiden Implementierungen, die ich geschrieben habe, um irgendwie zusammenzuarbeiten.
Allerdings verstehe ich den Groovy nicht gut genug, um die Frage selbst substanziell zu kommentieren; Ich kann nur helfen, die Clojure-Seite der Frage zu beschreiben.
Tags und Links clojure groovy protocols categories