Dopasowywanie wzorów w Clojure vs Scala

12

Jakie są kluczowe różnice między dopasowaniem wzorców w tych dwóch językach? Nie odnoszę się do składni, ale możliwości, szczegółów implementacji, zakresu przypadków użycia i konieczności.

Aplikacje Scala (np. Lift and Play) mówią z dumą o sprawności dopasowywania wzorców języków. Z drugiej strony Clojure ma bibliotekę, core.match i wbudowaną funkcję destrukcji, która również wydaje się potężna.

* Uwaga: Inspiracją do zadania tego pytania jest blog, w którym widziałem, w którym programista w ramach eksperymentu zbudował interpretera seplenienia przy użyciu Scali i Clojure. Powiedział, że mecze Clojure zepsuły się po pewnym czasie, ale nie mógł wyjaśnić, dlaczego, ale jestem naprawdę ciekawy, aby wiedzieć. Ten post można znaleźć tutaj: http://www.janvsmachine.net/2013/09/writing-simple-lisp-interpreter-in-clojure.html

kurofune
źródło
3
@gnat Wpis na blogu wydaje się naprawdę przypadkowy. Wydaje mi się, że tak naprawdę nie obchodzi go wyjaśnienie bloga jako takiego, tylko porównanie tego, jak konkretna funkcja językowa różni się w dwóch konkretnych językach. Czy to nie jest obiektywnie odpowiedzialne?
Doval,
3
W obronie tego pytania: jest obiektywne, dobrze napisane i jasne. Dlaczego ważne jest, aby PO przeczytał blog przed opublikowaniem tego pytania? To nie zmienia jakości pytania.
1
To nie jest Gorilla vs. Shark, ponieważ prosi o bardzo szczegółowe informacje na temat jednej bardzo konkretnej funkcji, która jest wspólna dla obu języków, nawet jeśli może być zaimplementowana inaczej w obu. To jest o wiele bardziej ukierunkowane pytanie niż Gorilla vs. Shark.
Evicatos,
1
Zgoda. Gorilla vs. Shark polega na porównaniu dwóch rzeczy, które są nieporównywalne, takich jak jabłka i pomarańcze. Porównanie implementacji funkcji w dwóch językach to nie Gorilla vs. Shark. Jest to konkretne, istotne i rodzaj pytania, którym interesują się eksperci. To nie jest tylko pytanie „pomóż mi wybrać język”.
Karl Bielefeldt,
1
Powodem, dla którego wspomniałem o blogu, było wyjaśnienie, co skłoniło mnie do zadania pytania. Pomyślałem, że to dobry przypis do mojego aktualnego pytania. Wyjaśniłem niektóre, abyś nie musiał sam tego czytać, ale zamieściłem link na wypadek, gdybyś to zrobił. Pomyślałem, że * i „uwaga:” były dość jasne, ale myślę, że powinienem także dodać nawiasy i linię myślników. PS: rekiny.
kurofune

Odpowiedzi:

21

W tym filmie, który ostatnio oglądałem, Rich Hickey komentuje, że podoba mu się destrukcyjna część języków takich jak Scala, ale nie tak bardzo część pasująca do wzorca i odpowiednio zaprojektował Clojure. To prawdopodobnie tłumaczy, dlaczego dopasowanie wzorców jest w bibliotece i nie jest tak niezawodne, chociaż problemy, o których wspomniałeś we wpisie, są wyraźnie błędne.

To, co Rich Hickey wymienia jako alternatywę dla dopasowywania wzorców, to multimetody . Większość języków umożliwia wysyłanie polimorficzne w zależności od typu. Niektóre języki pozwalają to również robić na podstawie wartości. Korzystając z wielu metod, Clojure pozwala to zrobić na podstawie dowolnej dowolnej funkcji. To dość potężna koncepcja.

Sprowadza się to do zasady, że programiści używający języka powinni używać jego najlepszych idiomów. Próba napisania kodu podobnego do Scali w Clojure będzie miała trudności i na odwrót.

Karl Bielefeldt
źródło
Dziękuję za bardzo interesującą odpowiedź na moje pytanie. Nigdy nie myślałem w ten sposób o wielu metodach! Wydaje się, że byłoby to przesadne w przypadku prostych zadań, ale zdecydowanie potężne. Zgadzam się również z tym, co powiedziałeś o idiomie. Nie mogę się doczekać, aby się tego dowiedzieć w Clojure :)
kurofune,
Dziękuję za tę odpowiedź. Połączony film wspomina o dopasowaniu wzorca, gdy Rich mówi: „Jeśli zazdrościsz dopasowywania wzorca, jest to połowa tego, z wyjątkiem części tego, co mi się nie podoba, czyli części warunkowej”. github.com/matthiasn/talk-transcripts/pull/90/files#
Hawkeye