【发布时间】:2016-12-09 14:13:09
【问题描述】:
我正在尝试this teaching text on Clojure 中的问题 4 并且对我的程序的结果感到困惑:
(def logging-enabled true)
(defmacro log
"uses a var, logging-enabled, to determine whether or not to print an expression to the console at compile time. If logging-enabled is false, (log :hi) should macroexpand to nil. If logging-enabled is true, (log :hi) should macroexpand to (prn :hi)."
[expr]
(if logging-enabled
`(prn ~expr)
nil
))
当我尝试测试我的程序时,评估下面的每个表单
(let [logging-enabled true]
(log "hi there"))
(let [logging-enabled false]
(log "hi there"))
(let [logging-enabled true]
(macroexpand (log "hi there")))
导致 REPL 回复完全相同的响应:
user=>
"hi there"
nil
user=>
hi there 表示宏返回了 true 分支
它的if 表格。 nil 将是封闭的返回值
let 表单。
但问题是:为什么要打印 "hi there"
在我的第二个测试表单中,logging-enabled 的范围为 false
上面?
还有:为什么macroexpand 不扩展我的宏而只是做
和上面的两个测试表一样吗?
【问题讨论】: