【发布时间】:2015-05-08 19:01:16
【问题描述】:
我是 Lisp 的新手,正在阅读 Doug Hoyte 的 Let Over Lambda,他在第 3 章介绍了 Paul Graham 的 nif 宏。我正在玩这个并制作了这两个宏:
(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 被反引号,所以我认为这意味着它不会被评估。在没有宏扩展的情况下评估 niffy 和 niffy2 都完全符合我的预期,分别返回正值、零值和负值的“正”、“零”和“负”。
【问题讨论】:
标签: macros lisp common-lisp let