Correspondência de padrões em Clojure vs Scala

12

Quais são as principais diferenças entre a correspondência de padrões nesses dois idiomas? Não estou me referindo à sintaxe, mas à capacidade, detalhes de implementação, variedade de casos de uso e necessidade.

Os aplicativos Scala (por exemplo, Lift and Play) falam com orgulho sobre as proezas de correspondência de padrões de idiomas. O Clojure, por outro lado, possui uma biblioteca, core.match, e uma desestruturação integrada, que também parece poderosa.

* note: O motivo de me inspirar a fazer essa pergunta é por causa de um post que vi no qual um programador, como um experimento, construiu um intérprete de Lisp usando Scala e Clojure. Ele disse que as partidas de Clojure se romperam após um certo período, mas não conseguiram explicar o porquê, mas estou realmente curioso para saber. Você pode encontrar esta publicação aqui: http://www.janvsmachine.net/2013/09/writing-simple-lisp-interpreter-in-clojure.html

Kurofune
fonte
3
@gnat O post do blog parece realmente incidental. Parece-me que ele realmente não se importa com uma explicação para o blog em si, apenas uma comparação de como um recurso de idioma específico difere em dois idiomas específicos. Isso não é objetivamente responsável?
Doval
3
Em defesa desta questão: é objetiva, bem escrita e clara. Por que importa que o OP leia um blog antes de postar esta pergunta? Isso não muda a qualidade da pergunta.
1
Isso não é Gorilla vs. Shark, porque ele está solicitando informações muito específicas sobre um recurso muito específico comum aos dois idiomas, mesmo que possa ser implementado de maneira diferente nos dois idiomas. Esta é uma pergunta muito mais focada do que Gorilla vs. Shark.
Evicatos
1
Acordado. Gorilla vs. Shark é sobre comparar duas coisas que são incomparáveis, como maçãs e laranjas. Comparar as implementações de um recurso em dois idiomas não é Gorilla vs. Shark. É específico, relevante e o tipo de pergunta na qual os especialistas estão interessados. Não é apenas uma pergunta "me ajude a escolher um idioma".
Karl Bielefeldt
1
O motivo pelo qual mencionei o blog foi completar sua compreensão do que me motivou a fazer a pergunta. Eu pensei que seria uma boa nota de rodapé para a minha pergunta real. Expliquei alguns para que você não precisasse lê-lo, mas incluí um link para o caso. Eu pensei que o * e "note:" deixavam isso bem claro, mas acho que eu deveria ter acrescentado alguns parênteses e uma linha de traços também. PS: tubarões.
precisa saber é o seguinte

Respostas:

21

Em este vídeo eu assisti recentemente, Rich Hickey comenta que ele gosta da parte desestruturação de línguas como o Scala, mas não tanto a parte padrão de correspondência, e ele projetou Clojure em conformidade. Isso provavelmente explica por que a correspondência de padrões está em uma biblioteca e não é tão robusta, embora os tipos de problemas vistos na postagem que você mencionou sejam claramente erros.

O que Rich Hickey menciona como uma alternativa à correspondência de padrões são vários métodos . A maioria dos idiomas permite fazer envios polimórficos com base no tipo. Alguns idiomas permitem que você faça isso com base em um valor. Usando vários métodos, o Clojure permite fazer isso com base em qualquer função arbitrária. Esse é um conceito bastante poderoso.

Tudo se resume ao princípio de que os programadores que usam uma linguagem devem usar os melhores idiomas da própria linguagem. Tentar escrever código semelhante ao Scala no Clojure terá suas dificuldades e vice-versa.

Karl Bielefeldt
fonte
Obrigado por uma resposta muito interessante à minha pergunta. Eu nunca pensei em multi-métodos dessa maneira! Parece que seria um exagero para tarefas simples, mas definitivamente poderoso. Também concordo com o que você disse sobre o idioma. Eu não posso esperar para pegar o jeito do que em Clojure :)
kurofune
Obrigado por esta resposta. O vídeo vinculado menciona a correspondência de padrões quando Rich diz "Se você tem inveja de correspondência de padrões, isso é metade disso, exceto a parte da qual eu não gosto, que é a parte condicional". github.com/matthiasn/talk-transcripts/pull/90/files#
hawkeye