Kết hợp mẫu trong Clojure vs Scala


12

Sự khác biệt chính giữa khớp mẫu trong hai ngôn ngữ này là gì? Tôi không đề cập đến cú pháp, nhưng khả năng, chi tiết triển khai, phạm vi sử dụng và sự cần thiết.

Các ứng dụng Scala (ví dụ: Nâng và Chơi) tự hào nói về khả năng phù hợp với mẫu ngôn ngữ. Clojure, mặt khác có một thư viện, core.match và được xây dựng trong việc phá hủy, cũng có vẻ mạnh mẽ.

* lưu ý: Lý do tôi được truyền cảm hứng để đặt câu hỏi này là vì một bài đăng trên blog mà tôi thấy trong đó một lập trình viên, như một thí nghiệm, đã xây dựng một trình thông dịch lisp sử dụng cả Scala và Clojure. Ông nói rằng các trận đấu Clojure đã bị phá vỡ sau một thời gian nhất định, nhưng không thể giải thích tại sao, nhưng tôi thực sự tò mò muốn biết. Bạn có thể tìm thấy bài đăng này tại đây: http://www.janvsmachine.net/2013/09/writer-simple-lisp-interpreter-in-clojure.html


3
@gnat Bài viết trên blog có vẻ rất tình cờ. Dường như với tôi anh ấy không thực sự quan tâm đến một lời giải thích cho blog, chỉ là so sánh về cách một tính năng ngôn ngữ cụ thể khác nhau giữa hai ngôn ngữ cụ thể. Đó không phải là câu trả lời khách quan sao?
Doval

3
Để bảo vệ câu hỏi này: nó khách quan, được viết tốt và rõ ràng. Tại sao OP lại đọc blog trước khi đăng câu hỏi này? Điều đó không thay đổi chất lượng của câu hỏi.

1
Đây không phải là Gorilla vs Shark vì anh ta yêu cầu thông tin rất cụ thể về một tính năng rất cụ thể chung cho cả hai ngôn ngữ, ngay cả khi nó có thể được triển khai khác nhau ở cả hai ngôn ngữ. Đây là một câu hỏi tập trung hơn nhiều so với Gorilla so với Shark.
Evicatos

1
Đã đồng ý. Gorilla vs Shark là về việc so sánh hai thứ không thể so sánh được, như táo và cam. So sánh việc triển khai một tính năng trong hai ngôn ngữ không phải là Gorilla so với Shark. Nó cụ thể, có liên quan và là loại câu hỏi mà các chuyên gia quan tâm. Đây không chỉ là câu hỏi "giúp tôi chọn ngôn ngữ".
Karl Bielefeldt

1
Lý do tôi đề cập đến blog là để làm tròn sự hiểu biết của bạn về những gì thúc đẩy tôi đặt câu hỏi. Tôi nghĩ rằng nó sẽ là một chú thích tốt cho câu hỏi thực tế của tôi. Tôi đã giải thích một số để bạn không cần phải đọc nó, nhưng bao gồm một liên kết trong trường hợp bạn đã làm. Tôi nghĩ rằng * và "ghi chú:" đã làm cho nó khá rõ ràng, nhưng tôi đoán tôi cũng nên thêm một số dấu ngoặc đơn và một dòng dấu gạch ngang. PS: cá mập.
Kurofune

Câu trả lời:


21

Trong video này tôi đã xem gần đây, Rich Hickey nhận xét rằng anh ấy thích phần phá hủy của các ngôn ngữ như Scala, nhưng không quá nhiều phần phù hợp với mô hình, và anh ấy đã thiết kế Clojure theo đó. Điều đó có thể giải thích tại sao việc khớp mẫu nằm trong thư viện và không mạnh mẽ, mặc dù loại vấn đề được thấy trong bài đăng mà bạn đề cập rõ ràng là lỗi.

Những gì Rich Hickey đề cập đến như là một thay thế cho khớp mẫu là đa phương thức . Hầu hết các ngôn ngữ cho phép bạn thực hiện công văn đa hình dựa trên loại. Một số ngôn ngữ cho phép bạn cũng làm điều đó dựa trên một giá trị. Sử dụng multimethods, Clojure cho phép bạn làm điều đó dựa trên bất kỳ chức năng tùy ý nào. Đó là một khái niệm khá mạnh mẽ.

Nguyên tắc là các lập trình viên sử dụng một ngôn ngữ nên sử dụng các thành ngữ tốt nhất của ngôn ngữ đó. Cố gắng viết mã giống Scala trong Clojure sẽ gặp khó khăn và ngược lại.


Cảm ơn bạn đã trả lời rất thú vị cho câu hỏi của tôi. Tôi chưa bao giờ nghĩ về đa phương pháp theo cách đó! Có vẻ như nó sẽ là quá mức cho các nhiệm vụ đơn giản nhưng chắc chắn mạnh mẽ. Tôi đồng ý với những gì bạn nói về thành ngữ quá. Tôi không thể chờ đợi để hiểu được điều đó ở Clojure :)
Kurofune

Cảm ơn câu trả lời này. Video được liên kết đề cập đến việc khớp mẫu khi Rich nói "Nếu bạn có mẫu phù hợp với sự đố kị, thì đây là một nửa trong số đó, ngoại trừ phần mà tôi không thích, đó là phần có điều kiện." github.com/matthiasn/talk-transcripts/pull/90/files#
hawkeye 30/11/19
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.