ฉันยังใหม่กับ Lisp และฉันกำลังอ่าน Let Over Lambda ของ Doug Hoyte และเขานำเสนอแมโคร nif
ของ Paul Graham ในบทที่ 3 ฉันกำลังเล่นกับเรื่องนั้นและสร้างมาโครสองตัวนี้:
(defmacro niffy (expr pos zero neg)
`(cond ((plusp ,expr) ,pos)
((zerop ,expr) ,zero)
(t ,neg)))
(defmacro niffy2 (expr pos zero neg)
`(let ((x ,expr))
(cond ((plusp x) ,pos)
((zerop x) ,zero
(t ,neg)))))
เมื่อฉันทำ (macroexpand '(niffy2 10 "positive" "zero" "negative"))
ฉันได้รับสิ่งที่ฉันคาดหวัง: (LET ((X 10)) (COND ((PLUSP X) "positive") ((ZEROP X) "zero" (T "negative"))))
แต่เมื่อฉันทำ (macroexpand '(niffy 10 "positive" "zero" "negative"))
ฉันเพิ่งได้รับแบบฟอร์มการประเมิน "positive"
ซึ่งทำให้ฉันสับสนเพราะใน niffy
, cond
ถูก backquoted ดังนั้นฉันคิดว่านั่นหมายความว่ามันจะไม่ได้รับการประเมิน การประเมินทั้ง niffy
และ niffy2
โดยไม่มีการขยายมาโคร ทั้งสองทำงานตรงตามที่ฉันคาดหวัง โดยส่งคืน "บวก", "ศูนย์" และ "ลบ" สำหรับค่าบวก ศูนย์ และลบ ตามลำดับ