นี่คือสิ่งที่ฉันใช้สำหรับการแก้ไขข้อบกพร่อง (ใน Clojure):
user=> (defmacro print-var [varname] `(println ~(name varname) "=" ~varname))
#'user/print-var
=> (def x (reduce * [1 2 3 4 5]))
#'user/x
=> (print-var x)
x = 120
nil
ฉันต้องจัดการกับตารางแฮชแบบรีดด้วยมือใน C ++ ซึ่งget
วิธีนี้ใช้การอ้างอิงสตริงที่ไม่ใช่ const เป็นอาร์กิวเมนต์ซึ่งหมายความว่าฉันไม่สามารถเรียกมันด้วยตัวอักษรได้ เพื่อให้ง่ายต่อการจัดการกับฉันเขียนสิ่งต่อไปนี้:
#define LET(name, value, body) \
do { \
string name(value); \
body; \
assert(name == value); \
} while (false)
ในขณะที่บางอย่างเช่นปัญหานี้ไม่น่าจะเกิดขึ้นในการกระเพื่อมผมพบว่ามันมีความสุขโดยเฉพาะอย่างยิ่งที่คุณสามารถมีแมโครที่ไม่ได้ประเมินความขัดแย้งของพวกเขาเป็นครั้งที่สองเช่นโดยการแนะนำจริงขอให้มีผลผูกพัน (ยอมรับนี่ฉันจะได้รับรอบ ๆ )
ฉันยังหันไปใช้แฮ็คที่น่าเกลียดอย่างยิ่งในการห่อสิ่งต่าง ๆ ในแบบdo ... while (false)
ที่คุณสามารถใช้ในส่วนนั้นของ if และยังคงมีงานส่วนอื่นตามที่คาดไว้ คุณไม่ต้องการสิ่งนี้ในเสียงกระเพื่อมซึ่งเป็นฟังก์ชั่นของแมโครที่ทำงานบนต้นไม้ไวยากรณ์มากกว่าสตริง (หรือลำดับโทเค็นฉันคิดว่าในกรณีของ C และ C ++) ซึ่งได้รับการแยกวิเคราะห์
มีมาโครในตัวอยู่สองสามตัวซึ่งสามารถใช้ในการจัดระเบียบโค้ดของคุณใหม่เพื่อให้อ่านได้อย่างสะอาดยิ่งขึ้น ('เธรด' เหมือนกับใน 'การหว่านรหัสของคุณเข้าด้วยกัน' ไม่ใช่การขนานกัน) ตัวอย่างเช่น:
(->> (range 6) (filter even?) (map inc) (reduce *))
มันใช้รูปแบบแรก(range 6)
และทำให้มันเป็นอาร์กิวเมนต์สุดท้ายของรูปแบบต่อไป(filter even?)
ซึ่งจะทำให้อาร์กิวเมนต์สุดท้ายของรูปแบบต่อไปและอื่น ๆ เช่นที่ได้รับการเขียนด้านบน
(reduce * (map inc (filter even? (range 6))))
ฉันคิดว่าคนแรกอ่านได้ชัดเจนยิ่งขึ้น: "เอาข้อมูลเหล่านี้ไปทำมันจากนั้นทำอย่างนั้นทำสิ่งอื่นแล้วเราก็ทำเสร็จ" แต่นั่นเป็นเรื่องส่วนตัว สิ่งที่เป็นความจริงอย่างเป็นกลางคือคุณอ่านการดำเนินการตามลำดับที่แสดง
นอกจากนี้ยังมีตัวแปรที่แทรกรูปแบบก่อนหน้านี้เป็นอาร์กิวเมนต์แรก (แทนล่าสุด) กรณีใช้งานหนึ่งค่าคือเลขคณิต:
(-> 17 (- 2) (/ 3))
อ่านเป็น "รับ 17, ลบ 2 แล้วหารด้วย 3"
เมื่อพูดถึงเลขคณิตคุณสามารถเขียนแมโครที่ใช้การแยกวิเคราะห์สัญกรณ์เพื่อให้คุณสามารถพูดเช่น(infix (17 - 2) / 3)
และจะคายออก(/ (- 17 2) 3)
ซึ่งมีข้อเสียของการอ่านน้อยลงและข้อดีของการเป็นนิพจน์เสียงกระเพื่อมที่ถูกต้อง นั่นคือส่วนย่อยของ DSL / data