Каковы основные различия между сопоставлением с образцом в этих двух языках? Я не имею в виду синтаксис, но возможности, детали реализации, диапазон вариантов использования и необходимость.
Приложения Scala (например, Lift and Play) гордо говорят о мастерстве соответствия шаблонов языков. Clojure, с другой стороны, имеет библиотеку core.match и встроенную деструктуризацию, которая также кажется мощной.
* примечание: причина, по которой я был вдохновлен задавать этот вопрос, заключается в том, что я увидел пост в блоге, в котором программист в качестве эксперимента создал интерпретатор lisp с использованием Scala и Clojure. Он сказал, что матчи Clojure прервались после определенной продолжительности, но не смог объяснить почему, но мне действительно любопытно узнать. Вы можете найти этот пост здесь: http://www.janvsmachine.net/2013/09/writing-simple-lisp-interpreter-in-clojure.html
Ответы:
В этом видео, которое я смотрел недавно, Рич Хикки комментирует, что ему нравится деструктурирующая часть языков, таких как Scala, но не столько часть соответствия шаблону, и он соответственно разработал Clojure. Это, вероятно, объясняет, почему сопоставление с образцом происходит в библиотеке и не так надежно, хотя проблемы, отмеченные в упомянутом вами посте, явно ошибочны.
В качестве альтернативы сопоставлению с образцом Рич Хики упоминает мультиметоды . Большинство языков позволяют вам осуществлять полиморфную отправку в зависимости от типа. Некоторые языки позволяют вам делать это в зависимости от значения. Используя мультиметоды, Clojure позволяет вам делать это на основе любой произвольной функции. Это довольно мощная концепция.
Все сводится к тому, что программисты, использующие язык, должны использовать лучшие идиомы языка. Попытка написать Scala-подобный код в Clojure будет иметь свои трудности, и наоборот.
источник