Unterschied zwischen Clojure-Protokollen und Groovy-Kategorien

8

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:

  1. abgesehen von Leistungsunterschieden (es wird gesagt, dass Clojure in dieser Hinsicht hoch optimiert ist) - gibt es einen semantischen Unterschied zwischen den beiden Ansätzen?
  2. Gibt es außer der ungeschickten Syntax etwas logisch falsches mit dem Groovy-Ansatz?

Disclaimer: Ich bin ein kompletter Clojure-Neuling!

    
Ice09 29.03.2012, 23:43
quelle

2 Antworten

10

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)

  • Die Clojure-Protokolldefinition enthält keine Implementierung (in dieser Hinsicht eher eine Schnittstelle). Die Implementierung wird separat bereitgestellt: Sie können das absenkbare Protokoll auf beliebig viele Klassen erweitern, ohne die Klassen selbst oder die Protokolldefinition ändern zu müssen. Zum Beispiel könnten Sie lower für die Arbeit an einem Seil definieren.
  • Ihre obige Groovy-Kategorie ist auf Strings spezialisiert - dies ist bei Clojure-Protokollen nicht der Fall. In diesem Beispiel wird das Clojure-Protokoll "Abnehmbar" definiert, ohne etwas über den Typ der Argumente zu sagen.
  • 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 stark optimiert, da sie den schnellen Methodenversand der JVM ausnutzen sollen. Sie werden daher zu sehr effizientem Code kompiliert (es ist keine dynamische Objektuntersuchung oder -reflexion erforderlich)

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 ...

    
mikera 30.03.2012, 04:01
quelle
5

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.

    
amalloy 30.03.2012 03:00
quelle