Сопоставление с образцом в Clojure vs Scala

12

Каковы основные различия между сопоставлением с образцом в этих двух языках? Я не имею в виду синтаксис, но возможности, детали реализации, диапазон вариантов использования и необходимость.

Приложения Scala (например, Lift and Play) гордо говорят о мастерстве соответствия шаблонов языков. Clojure, с другой стороны, имеет библиотеку core.match и встроенную деструктуризацию, которая также кажется мощной.

* примечание: причина, по которой я был вдохновлен задавать этот вопрос, заключается в том, что я увидел пост в блоге, в котором программист в качестве эксперимента создал интерпретатор lisp с использованием Scala и Clojure. Он сказал, что матчи Clojure прервались после определенной продолжительности, но не смог объяснить почему, но мне действительно любопытно узнать. Вы можете найти этот пост здесь: http://www.janvsmachine.net/2013/09/writing-simple-lisp-interpreter-in-clojure.html

Kurofune
источник
3
@gnat Сообщение в блоге кажется действительно случайным. Мне кажется, что он на самом деле не заботится об объяснении блога как такового, просто сравнение того, как особенность языка отличается на двух конкретных языках. Разве это не объективно ответственно?
Довал
3
В защиту этого вопроса: это объективно, хорошо написано и понятно. Почему важно, чтобы ОП прочитал блог, прежде чем отправлять этот вопрос? Это не меняет качество вопроса.
1
Это не Горилла против Акулы, потому что он запрашивает очень конкретную информацию об одной очень специфической функции, которая является общей для обоих языков, даже если она может быть реализована по-разному в обоих. Это гораздо более сфокусированный вопрос, чем «Горилла против Акулы».
Evicatos
1
Согласовано. «Горилла против Акулы» - это сравнение двух несравненных вещей, таких как яблоки и апельсины. Сравнение реализаций функции на двух языках не Горилла против Акулы. Это конкретный, актуальный и тот вопрос, который интересует экспертов. Это не просто вопрос «помоги мне выбрать язык».
Карл Билефельдт
1
Причина, по которой я упомянул блог, заключалась в том, чтобы вы поняли, что побудило меня задать вопрос. Я подумал, что это будет хорошая сноска к моему актуальному вопросу. Я объяснил некоторые из них, чтобы вам не нужно было читать их самостоятельно, но включил ссылку на случай, если вы это сделали. Я подумал, что * и "note:" прояснили это, но, думаю, мне следовало бы добавить несколько скобок и черточку. PS: акулы.
kurofune

Ответы:

21

В этом видео, которое я смотрел недавно, Рич Хикки комментирует, что ему нравится деструктурирующая часть языков, таких как Scala, но не столько часть соответствия шаблону, и он соответственно разработал Clojure. Это, вероятно, объясняет, почему сопоставление с образцом происходит в библиотеке и не так надежно, хотя проблемы, отмеченные в упомянутом вами посте, явно ошибочны.

В качестве альтернативы сопоставлению с образцом Рич Хики упоминает мультиметоды . Большинство языков позволяют вам осуществлять полиморфную отправку в зависимости от типа. Некоторые языки позволяют вам делать это в зависимости от значения. Используя мультиметоды, Clojure позволяет вам делать это на основе любой произвольной функции. Это довольно мощная концепция.

Все сводится к тому, что программисты, использующие язык, должны использовать лучшие идиомы языка. Попытка написать Scala-подобный код в Clojure будет иметь свои трудности, и наоборот.

Карл Билефельдт
источник
Спасибо за очень интересный ответ на мой вопрос. Я никогда не думал о мульти-методах таким образом! Кажется, это было бы излишним для простых задач, но определенно мощным. Я согласен с тем, что вы сказали идиома тоже. Я не могу дождаться, чтобы получить представление об этом в Clojure :)
kurofune
Спасибо за этот ответ. В связанном видео упоминается сопоставление с образцом, когда Рич говорит: «Если у вас зависть к сопоставлению с образцом, это половина того, за исключением той части, которая мне не нравится, а именно условной части». github.com/matthiasn/talk-transcripts/pull/90/files#
Hawkeye