【发布时间】:2012-09-24 21:39:04
【问题描述】:
我正在努力更好地理解listing 13.3 in The Joy of Clojure。它是一个生成其他宏的宏(很像 Clojure 1.4 中原始数组函数的实现方式)。
我想编写一个宏,它在运行时只打印生成的宏的后缀。即
user=> (nested-macro joe)
user=> (nested-macro-named-joe)
hello from joe
nil
我无法完成这项工作。
这是我尝试过的:
尝试 1
(defmacro nested-macro [name]
`(defmacro ~(symbol (str "nested-macro-named-" name))
[]
`(println "hello from " ~name)))
输出:
hello from #<core$name clojure.core$name@502c06b2>
尝试 2
(defmacro nested-macro [name]
(let [local-name name]
`(defmacro ~(symbol (str "my-custom-macro-named-" ~local-name))
[]
`(println "hello from " ~local-name))))
错误
IllegalStateException Attempting to call unbound fn: #'clojure.core/unquote clojure.lang.Var$Unbound.throwArity (Var.java:43)
尝试 3:
(defmacro nested-macro [name]
(let [local-name name]
`(defmacro ~(symbol (str "nested-macro-named-" name))
[]
`(println "hello from " ~(symbol local-name)))))
编译器错误:
CompilerException java.lang.RuntimeException: No such var: joy.dsl/local-name
只是为了它,我还尝试将 # 添加到局部变量中,结果与上面类似,但使用“自动”名称,例如 local-name__1127__auto__ 我不认为这是一部分然而,解决方案。
我怎样才能做到这一点?
【问题讨论】: