【发布时间】:2016-12-27 22:16:54
【问题描述】:
我定义了一个宏来将一个从字符串派生的符号绑定到这样的字符串:
lein repl
... Clojure 1.8.0 ...
user=> (defmacro foo [s] `(def ~(symbol s) ~s))
#'user/foo
在顶层调用时按预期工作:
user=> (foo "asdf")
#'user/asdf
user=> asdf
"asdf"
但是当我尝试映射一个通过序列调用宏的函数时,宏会绑定函数参数符号而不是我想要的:
user=> (map (fn [x] (foo x)) ["qwer"])
(#'user/x)
user=> x
"qwer"
user=> qwer
CompilerException ... Unable to resolve symbol: qwer ...
以下替代方案绑定 Clojure 创建的临时符号:
user=> (map #(foo %) ["qwer"])
(#'user/p1__1253#)
正如我在 StackOverflow 上研究的一些现有答案所建议的那样,当包裹在 doall 中时它也不起作用。
如何定义一个可以映射(在函数中或以其他方式)到字符串集合的符号绑定宏?
【问题讨论】: