Correspondance de motifs dans Clojure vs Scala

12

Quelles sont les principales différences entre la correspondance de motifs dans ces deux langues? Je ne fais pas référence à la syntaxe, mais à la capacité, aux détails d'implémentation, à la gamme de cas d'utilisation et à la nécessité.

Les applications Scala (par exemple, Lift and Play) parlent fièrement des prouesses de correspondance des modèles de langues. Clojure, quant à lui, dispose d'une bibliothèque, core.match, et d'une déstructuration intégrée, qui semble également puissante.

* note: La raison pour laquelle j'ai été inspiré de poser cette question est à cause d'un article de blog que j'ai vu dans lequel un programmeur, à titre d'expérience, a construit un interprète lisp en utilisant à la fois Scala et Clojure. Il a dit que les matchs de Clojure avaient éclaté après une certaine durée, mais ne pouvaient pas expliquer pourquoi, mais je suis vraiment curieux de savoir. Vous pouvez trouver cet article ici: http://www.janvsmachine.net/2013/09/writing-simple-lisp-interpreter-in-clojure.html

kurofune
la source
3
@gnat Le billet de blog semble vraiment accessoire. Il me semble qu'il ne se soucie pas vraiment d'une explication au blog en soi, juste d'une comparaison de la façon dont une fonctionnalité de langue particulière diffère entre deux langues spécifiques. N'est-ce pas objectivement responsable?
Doval
3
Pour défendre cette question: c'est objectif, bien écrit et clair. Pourquoi est-il important que le PO lise un blog avant de poster cette question? Cela ne change pas la qualité de la question.
1
Ce n'est pas Gorilla vs Shark car il demande des informations très spécifiques sur une fonctionnalité très spécifique commune aux deux langues, même si elle peut être implémentée différemment dans les deux. C'est une question beaucoup plus ciblée que Gorilla vs Shark.
Evicatos
1
D'accord. Gorilla vs. Shark consiste à comparer deux choses incomparables, comme les pommes et les oranges. Comparer les implémentations d'une fonctionnalité en deux langues n'est pas Gorilla vs Shark. C'est spécifique, c'est pertinent, et le genre de question qui intéresse les experts. Ce n'est pas seulement une question "aidez-moi à choisir une langue".
Karl Bielefeldt
1
La raison pour laquelle j'ai mentionné le blog était de compléter votre compréhension de ce qui m'a motivé à poser la question. Je pensais que ce serait une bonne note de bas de page pour ma vraie question. J'en ai expliqué certains pour que vous n'ayez pas besoin de le lire vous-même, mais j'ai inclus un lien au cas où vous l'auriez fait. Je pensais que le * et la "note:" rendaient cela assez clair, mais je suppose que j'aurais dû ajouter quelques parenthèses et une ligne de tirets aussi. PS: requins.
kurofune

Réponses:

21

Dans cette vidéo que j'ai regardée récemment, Rich Hickey commente qu'il aime la partie destructrice de langages comme Scala, mais pas tellement la partie de correspondance de motifs, et il a conçu Clojure en conséquence. Cela explique probablement pourquoi la correspondance de modèles est dans une bibliothèque et n'est pas aussi robuste, bien que le type de problèmes rencontrés dans le message que vous avez mentionné soit clairement des bogues.

Ce que Rich Hickey mentionne comme alternative à la correspondance de motifs, ce sont les multiméthodes . La plupart des langues vous permettent d'effectuer une répartition polymorphe en fonction du type. Certaines langues vous permettent également de le faire en fonction d'une valeur. À l'aide de plusieurs méthodes, Clojure vous permet de le faire en fonction de n'importe quelle fonction arbitraire. C'est un concept assez puissant.

Cela revient au principe que les programmeurs utilisant un langage devraient utiliser les meilleurs idiomes du langage. Essayer d'écrire du code de type Scala dans Clojure va avoir ses difficultés, et vice versa.

Karl Bielefeldt
la source
Merci pour une réponse très intéressante à ma question. Je n'ai jamais pensé aux multi-méthodes de cette façon! Il semble que ce serait exagéré pour des tâches simples mais certainement puissant. Je suis également d'accord avec ce que vous avez dit sur l'idiome. J'ai hâte de comprendre à Clojure :)
kurofune
Merci pour cette réponse. La vidéo liée mentionne la correspondance de motifs lorsque Rich dit "Si vous avez envie de correspondance de motifs, c'est la moitié de cela, sauf la partie de ce que je n'aime pas, qui est la partie conditionnelle". github.com/matthiasn/talk-transcripts/pull/90/files#
hawkeye