สิ่งที่เป็นปัญหาในทางปฏิบัติเป็นผลมาจากการขาดแมโครที่ถูกสุขอนามัยใน Clojure?


11

ฉันเคยได้ยินมาโคร Clojure นั้นเขียนได้ง่ายกว่า แต่ไม่น่าเชื่อถือเท่ากับแมโครที่ถูกสุขอนามัยของ Racket คำถามของฉันมี 2 ส่วน:

  1. วิธีการที่ไม่gensymแตกต่างจากแมโครที่ถูกสุขอนามัย?
  2. มาโคร Racket ให้อะไรที่ Clojure ทำไม่ได้? (ไม่ว่าจะเป็นความปลอดภัยการประกอบหรืออะไรก็ได้)

2
มาโครที่ถูกสุขลักษณะเป็นมาโครที่รับประกันการขยายตัวไม่ให้จับตัวระบุโดยไม่ได้ตั้งใจ ปัญหาทั่วไปของการจับกุมโดยไม่ตั้งใจเป็นที่รู้จักกันดีในชุมชน Lisp ก่อนที่จะมีการแนะนำแมโครที่ถูกสุขลักษณะ ตัวเขียนแมโครจะใช้คุณลักษณะภาษาที่จะสร้างตัวระบุที่ไม่ซ้ำกัน (เช่น Gensym) หรือใช้ตัวระบุที่สับสนเพื่อหลีกเลี่ยงปัญหา มาโครที่ถูกสุขลักษณะเป็นวิธีการแก้ปัญหาแบบเป็นโปรแกรมสำหรับปัญหาการดักจับที่รวมเข้ากับตัวขยายแมโคร en.wikipedia.org/wiki/Hygienic_macro
Robert Harvey

3
เนื่องจากระบบแมโครที่ถูกสุขลักษณะของ [Racket] มีความรู้อย่างลึกซึ้งเกี่ยวกับวิธีการทำงานของแมโครของคุณแมโครของคุณได้รับการผนวกรวมอย่างดีกับสภาพแวดล้อม: การเน้นไวยากรณ์ทำงานอย่างถูกต้องการเปลี่ยนชื่อตัวแปรอัตโนมัติทำงานอย่างถูกต้อง เนียนคุณสมบัติ [Racket] IDE กล่าวอีกนัยหนึ่งสุขอนามัยไม่เพียง แต่ปกป้องคุณจากข้อบกพร่องง่ายๆเช่นการจับตัวแปร - มันช่วยให้โค้ดของคุณวิเคราะห์อย่างเป็นทางการโดยเครื่องมือที่ไม่สามารถมีอยู่สำหรับ LISP ทั่วไป randomhacks.net/2002/09/13/hygienic-macros
Robert Harvey

คำตอบ:


6

ข้อได้เปรียบของมาโครที่ถูกสุขลักษณะนั้นไม่ใช่ความสามารถด้านภาษา - คุณสามารถเขียนมาโครที่มีสุขอนามัยที่ดีได้gensymและใช้คำพูด / คำพูดที่ไม่ถูกต้องในเวลาที่เหมาะสม อย่างไรก็ตามมาโครที่ถูกสุขลักษณะรับรองว่ามาโครของคุณมีสุขอนามัยที่ดี ในแง่นั้นมันก็เหมือนกับการตรวจสอบประเภท

นอกจากนี้ยังอาจมีข้อดีด้านการใช้เครื่องมือกับมาโครที่ถูกสุขลักษณะ ระบบแมโครที่ถูกสุขอนามัยส่วนใหญ่กำหนดควบคุมอย่างเข้มงวดว่าแมโครของคุณทำอะไรและทำอย่างไร (เช่นคุณไม่สามารถเรียกใช้รหัสโดยอำเภอใจเมื่อแมโครถูกกำหนดโดย Scheme syntax-caseถูกขยาย) สิ่งนี้สามารถทำให้ง่ายขึ้นในการเขียนโปรแกรมที่ "เข้าใจ" แมโครของคุณและสามารถให้การสนับสนุนเครื่องมือเพิ่มเติม

ในทางกลับกันมีบางกรณีที่มาโครที่ไม่ถูกสุขลักษณะอาจมีประโยชน์ ตัวอย่างเช่นหากคุณต้องการจับการเชื่อมโยงสำหรับตัวแปรเฉพาะ (เช่นมาโครแบบ anaphoric ) ฉันคิดว่าคุณโชคไม่ดีถ้าคุณมีมาโครที่ถูกสุขลักษณะ


2
gensymป้องกันแมโครจากการ messing กับผู้ใช้แมโครโดยไม่ได้ตั้งใจ แต่ไม่ได้ป้องกันผู้ใช้แมโครจาก messing กับแมโคร ตัวอย่างเช่นผู้ใช้แมโครสามารถกำหนดใหม่ifหรืออะไรทำนองนั้น (คำถามที่ว่า "ทำไมใครถึงทำอย่างนั้น" ไม่เกี่ยวข้องนี่เป็นตัวอย่างง่ายๆที่แสดงให้เห็นว่าเป็นไปได้และมันก็ยากที่จะให้เหตุผลเกี่ยวกับมาโครที่ไม่ถูกสุขลักษณะ)
Phil

2
มาโครที่ไม่ถูกสุขลักษณะนั้นมีประโยชน์อย่างแน่นอน ฉันไม่แน่ใจเกี่ยวกับ Scheme แต่ Racket มีการดำเนินงาน "อนามัยดัด" จำนวนมาก มาโครของภาษานั้นถูกสุขลักษณะโดยค่าเริ่มต้น พวกเขาทำให้คุณมีสติมากขึ้นเมื่อคุณทำลายสุขอนามัย
ฟิล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.