Pattern Matching in Clojure gegen Scala

12

Was sind die Hauptunterschiede zwischen Pattern Matching in diesen beiden Sprachen? Ich beziehe mich nicht auf die Syntax, sondern auf die Fähigkeiten, Implementierungsdetails, Anwendungsfälle und die Notwendigkeit.

Scala-Anwendungen (z. B. Lift and Play) sprechen stolz über die Fähigkeiten des Sprachmustervergleichs. Clojure hingegen verfügt über eine Bibliothek, core.match, und eine integrierte Destrukturierung, die ebenfalls leistungsstark zu sein scheint.

* Anmerkung: Der Grund, warum ich diese Frage gestellt habe, ist ein Blog-Beitrag, in dem ein Programmierer als Experiment einen Lisp-Interpreter mit Scala und Clojure erstellt hat. Er sagte, dass die Clojure-Streichhölzer nach einer gewissen Länge kaputt gingen, konnte aber nicht erklären, warum, aber ich bin wirklich neugierig zu wissen. Sie finden diesen Beitrag hier: http://www.janvsmachine.net/2013/09/writing-simple-lisp-interpreter-in-clojure.html

kurofune
quelle
3
@gnat Der Blogpost scheint wirklich nebensächlich zu sein. Es scheint mir, dass ihm eine Erklärung für den Blog per se nicht wirklich wichtig ist, nur ein Vergleich, wie sich ein bestimmtes Sprachmerkmal in zwei bestimmten Sprachen unterscheidet. Ist das nicht objektiv zu verantworten?
Doval
3
Zur Verteidigung dieser Frage: Sie ist objektiv, gut geschrieben und klar. Warum ist es wichtig, dass das OP einen Blog liest, bevor es diese Frage veröffentlicht? Das ändert nichts an der Qualität der Frage.
1
Dies ist nicht Gorilla vs. Shark, weil er nach sehr spezifischen Informationen zu einem bestimmten Merkmal fragt, das beiden Sprachen gemeinsam ist, auch wenn es in beiden Sprachen möglicherweise unterschiedlich implementiert ist. Dies ist eine viel konzentriertere Frage als Gorilla vs. Shark.
Evicatos
1
Einverstanden. Bei Gorilla vs. Shark geht es darum, zwei Dinge zu vergleichen, die unvergleichlich sind, wie Äpfel und Orangen. Der Vergleich der Implementierung eines Features in zwei Sprachen ist nicht Gorilla vs. Shark. Es ist spezifisch, relevant und die Art von Frage, an der Experten interessiert sind. Es ist nicht nur eine Frage, die mir bei der Auswahl einer Sprache hilft.
Karl Bielefeldt
1
Der Grund, warum ich den Blog erwähnte, war, Ihr Verständnis dafür abzurunden, was mich dazu motivierte, die Frage zu stellen. Ich dachte, es wäre eine gute Fußnote zu meiner eigentlichen Frage. Ich habe einige erklärt, damit Sie sie nicht selbst lesen müssen, aber für den Fall, dass Sie einen Link hinzugefügt haben. Ich dachte, das * und "note:" machten das ziemlich deutlich, aber ich denke, ich hätte auch ein paar Klammern und eine Reihe von Bindestrichen hinzufügen sollen. PS: Haie.
Kurofune

Antworten:

21

In diesem Video, das ich kürzlich gesehen habe, bemerkt Rich Hickey, dass er den destrukturierenden Teil von Sprachen wie Scala mag, aber nicht so sehr den Mustervergleichsteil, und er hat Clojure dementsprechend entworfen. Das erklärt wahrscheinlich, warum der Mustervergleich in einer Bibliothek und nicht so robust ist, obwohl die Art der Probleme, die in dem von Ihnen erwähnten Beitrag auftreten, eindeutig Fehler sind.

Was Rich Hickey als Alternative zum Pattern Matching erwähnt, sind Multimethoden . In den meisten Sprachen können Sie polymorphen Versand basierend auf dem Typ durchführen. In einigen Sprachen können Sie dies auch basierend auf einem Wert tun. Mit Clojure können Sie Multimethoden verwenden, die auf einer beliebigen Funktion basieren. Das ist ein ziemlich mächtiges Konzept.

Es kommt auf den Grundsatz an, dass Programmierer, die eine Sprache verwenden, die besten Redewendungen der Sprache verwenden sollten. Der Versuch, Scala-ähnlichen Code in Clojure zu schreiben, wird seine Schwierigkeiten haben und umgekehrt.

Karl Bielefeldt
quelle
Vielen Dank für eine sehr interessante Antwort auf meine Frage. So über Multi-Methoden habe ich noch nie nachgedacht! Es scheint, als wäre es für einfache Aufgaben übertrieben, aber definitiv mächtig. Ich bin damit einverstanden, was Sie auch über Idiom gesagt haben. Ich kann es kaum erwarten, in Clojure den
Dreh raus
Danke für diese Antwort. Das verknüpfte Video erwähnt Pattern Matching, wenn Rich sagt: "Wenn Sie Pattern Matching-Neid haben, ist dies die Hälfte davon, mit Ausnahme des Teils, den ich nicht mag, der der bedingte Teil ist." github.com/matthiasn/talk-transcripts/pull/90/files#
hawkeye