Coincidencia de patrones en Clojure vs Scala

12

¿Cuáles son las diferencias clave entre la coincidencia de patrones en estos dos idiomas? No me refiero a la sintaxis, sino a la capacidad, los detalles de implementación, el rango de casos de uso y la necesidad.

Las aplicaciones de Scala (p. Ej., Lift and Play) hablan con orgullo sobre la destreza de coincidencia de patrones de idiomas. Clojure, por otro lado, tiene una biblioteca, core.match, y una desestructuración integrada, que también parece poderosa.

* nota: La razón por la que me inspiré para hacer esta pregunta es por una publicación de blog que vi en la que un programador, como experimento, construyó un intérprete de lisp usando Scala y Clojure. Dijo que los partidos de Clojure se rompieron después de una cierta duración, pero no podía explicar por qué, pero tengo mucha curiosidad por saberlo. Puede encontrar esta publicación aquí: http://www.janvsmachine.net/2013/09/writing-simple-lisp-interpreter-in-clojure.html

kurofune
fuente
3
@gnat La publicación del blog parece realmente incidental. Me parece que realmente no le importa una explicación para el blog per se, solo una comparación de cómo una característica de idioma en particular difiere en dos idiomas específicos. ¿No es eso objetivamente responsable?
Doval
3
En defensa de esta pregunta: es objetiva, bien escrita y clara. ¿Por qué importa que el OP lea un blog antes de publicar esta pregunta? Eso no cambia la calidad de la pregunta.
1
Esto no es Gorilla vs. Shark porque está pidiendo información muy específica sobre una característica muy específica que es común a ambos idiomas, incluso si se implementa de manera diferente en ambos. Esta es una pregunta mucho más centrada que Gorilla vs. Shark.
Evicatos
1
Convenido. Gorilla vs. Shark se trata de comparar dos cosas que son incomparables, como las manzanas y las naranjas. Comparar las implementaciones de una característica en dos idiomas no es Gorilla vs. Shark. Es específico, es relevante y el tipo de pregunta en la que los expertos están interesados. No es solo una pregunta de "ayudarme a elegir un idioma".
Karl Bielefeldt
1
La razón por la que mencioné el blog fue para completar su comprensión de lo que me motivó a hacer la pregunta. Pensé que sería una buena nota a pie de página para mi pregunta real. Le expliqué algunos para que no necesite leerlo usted mismo, pero incluí un enlace en caso de que lo hiciera. Pensé que * y "nota:" lo dejaban bastante claro, pero supongo que también debería haber agregado algunos paréntesis y una línea de guiones. PD: tiburones.
kurofune

Respuestas:

21

En este video que vi recientemente, Rich Hickey comenta que le gusta la parte desestructuradora de lenguajes como Scala, pero no tanto la parte de coincidencia de patrones, y diseñó Clojure en consecuencia. Eso probablemente explica por qué la coincidencia de patrones está en una biblioteca y no es tan robusta, aunque el tipo de problemas vistos en la publicación que mencionó son claramente errores.

Lo que Rich Hickey menciona como una alternativa a la coincidencia de patrones son los métodos múltiples . La mayoría de los idiomas le permiten realizar envíos polimórficos según el tipo. Algunos idiomas también le permiten hacerlo en función de un valor. Usando métodos múltiples, Clojure le permite hacerlo en función de cualquier función arbitraria. Ese es un concepto bastante poderoso.

Todo se reduce al principio de que los programadores que usan un lenguaje deben usar sus mejores expresiones idiomáticas. Intentar escribir código similar a Scala en Clojure tendrá sus dificultades, y viceversa.

Karl Bielefeldt
fuente
Gracias por una respuesta muy interesante a mi pregunta. ¡Nunca pensé en los métodos múltiples de esa manera! Parece que sería excesivo para tareas simples pero definitivamente poderosas. Estoy de acuerdo con lo que dijiste sobre el idioma también. No puedo esperar para acostumbrarme a eso en Clojure :)
kurofune
Gracias por esta respuesta El video vinculado menciona la coincidencia de patrones cuando Rich dice "Si tienes envidia de coincidencia de patrones, esto es la mitad de eso, excepto la parte de eso que no me gusta, que es la parte condicional". github.com/matthiasn/talk-transcripts/pull/90/files#
hawkeye