การจับคู่รูปแบบใน Clojure vs Scala


12

อะไรคือความแตกต่างที่สำคัญระหว่างการจับคู่รูปแบบในสองภาษานี้ ฉันไม่ได้อ้างถึงไวยากรณ์ แต่ความสามารถรายละเอียดการใช้งานขอบเขตการใช้งานและความจำเป็น

แอปพลิเคชัน Scala (เช่น. ยกและเล่น) พูดอย่างภาคภูมิใจเกี่ยวกับรูปแบบภาษาที่ตรงกับความกล้าหาญ ในทางกลับกัน Clojure มีห้องสมุด core.match และสร้างขึ้นในการทำลายซึ่งดูเหมือนว่ามีประสิทธิภาพ

* หมายเหตุ: เหตุผลที่ฉันได้รับแรงบันดาลใจในการถามคำถามนี้เป็นเพราะการโพสต์บล็อกที่ฉันเห็นซึ่งโปรแกรมเมอร์ในการทดลองสร้างล่ามเสียงกระเพื่อมโดยใช้ทั้ง Scala และ Clojure เขาบอกว่าการแข่งขัน Clojure แตกหลังจากช่วงระยะเวลาหนึ่ง แต่ไม่สามารถอธิบายได้ว่าทำไม แต่ฉันอยากรู้จริงๆ คุณสามารถค้นหาโพสต์นี้ได้ที่นี่: http://www.janvsmachine.net/2013/09/writing-simple-lisp-interpreter-in-clojure.html


3
@gnat โพสต์บล็อกดูเหมือนไม่สำคัญจริงๆ สำหรับฉันดูเหมือนว่าเขาไม่สนใจคำอธิบายเกี่ยวกับบล็อกต่อการเปรียบเทียบความแตกต่างของคุณลักษณะของภาษาเฉพาะในสองภาษา มันไม่สามารถตอบได้อย่างเป็นกลางหรือ?
Doval

3
เพื่อป้องกันคำถามนี้: มีวัตถุประสงค์เขียนดีและชัดเจน เหตุใดจึงสำคัญที่ OP อ่านบล็อกก่อนโพสต์คำถามนี้ แต่นั่นไม่ได้เปลี่ยนคุณภาพของคำถาม

1
นี่ไม่ใช่ Gorilla vs. Shark เพราะเขาขอข้อมูลที่เฉพาะเจาะจงมากเกี่ยวกับคุณลักษณะเฉพาะที่เป็นเรื่องธรรมดาสำหรับทั้งสองภาษาถึงแม้ว่ามันจะมีการใช้งานที่แตกต่างกันในทั้งสองก็ตาม นี่เป็นคำถามที่มุ่งเน้นมากกว่ากอริลลากับฉลาม
Evicatos

1
ตกลง Gorilla vs. Shark นั้นเกี่ยวกับการเปรียบเทียบสองสิ่งที่หาที่เปรียบมิได้เช่นแอปเปิ้ลและส้ม การเปรียบเทียบการใช้งานของคุณสมบัติในสองภาษาไม่ใช่ Gorilla vs. Shark มันมีความเฉพาะเจาะจงมีความเกี่ยวข้องและเป็นคำถามที่ผู้เชี่ยวชาญให้ความสนใจไม่ใช่แค่คำถาม "ช่วยฉันเลือกภาษา"
Karl Bielefeldt

1
เหตุผลที่ฉันพูดถึงบล็อกนี้คือเพื่อให้คุณเข้าใจสิ่งที่กระตุ้นให้ฉันถามคำถาม ฉันคิดว่ามันจะเป็นเชิงอรรถที่ดีสำหรับคำถามจริงของฉัน ฉันอธิบายบางอย่างดังนั้นคุณไม่จำเป็นต้องอ่านด้วยตัวเอง แต่มีลิงค์ในกรณีที่คุณทำ ฉันคิดว่า * และ "note:" ทำให้ชัดเจน แต่ฉันคิดว่าฉันควรเพิ่มวงเล็บและเส้นประด้วย PS: ฉลาม
kurofune

คำตอบ:


21

ในวิดีโอนี้ฉันได้ดูเมื่อไม่นานมานี้ Rich Hickey แสดงความคิดเห็นว่าเขาชอบส่วนที่ทำลายล้างของภาษาเช่น Scala แต่ไม่ได้เป็นส่วนที่จับคู่รูปแบบมากนักและเขาออกแบบ Clojure ตามนั้น นั่นอาจอธิบายได้ว่าทำไมรูปแบบการจับคู่อยู่ในไลบรารีและไม่แข็งแกร่งแม้ว่าปัญหาที่พบในโพสต์ที่คุณกล่าวถึงเป็นข้อบกพร่องอย่างชัดเจน

อะไรรวย Hickey กล่าวเป็นทางเลือกในการจับคู่รูปแบบคือMultimethods ภาษาส่วนใหญ่ให้คุณจัดส่งแบบ polymorphic ตามชนิด บางภาษาให้คุณทำตามค่า การใช้มัลติวิธี Clojure ช่วยให้คุณทำตามฟังก์ชั่นโดยพลการใด ๆ นั่นเป็นแนวคิดที่ทรงพลัง

หลักการที่ผู้เขียนโปรแกรมใช้ภาษาควรใช้สำนวนที่ดีที่สุดของภาษานั้น ๆ การพยายามเขียนโค้ดที่คล้ายสกาล่าใน Clojure นั้นจะมีปัญหาและในทางกลับกัน


ขอบคุณสำหรับคำตอบที่น่าสนใจมากสำหรับคำถามของฉัน ฉันไม่เคยคิดถึงวิธีการหลายอย่างในวิธีนั้น! ดูเหมือนว่าจะเกินความจำเป็นสำหรับงานง่าย ๆ แต่มีประสิทธิภาพอย่างแน่นอน ฉันเห็นด้วยกับสิ่งที่คุณพูดเกี่ยวกับสำนวนด้วย ฉัน
แทบ

ขอบคุณสำหรับคำตอบนี้ วิดีโอที่เชื่อมโยงกล่าวถึงการจับคู่รูปแบบเมื่อ Rich บอกว่า "หากคุณมีรูปแบบการจับคู่อิจฉานี่เป็นครึ่งหนึ่งของสิ่งนั้นยกเว้นส่วนที่ฉันไม่ชอบซึ่งเป็นส่วนที่มีเงื่อนไข" github.com/matthiasn/talk-transcripts/pull/90/files#
hawkeye
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.