我正在尝试编写一个宏来以编程方式要求一些命名空间,以便传入参数的结果为(require 'value-of-argument)
。如果我说(defmacro r [x]`(require~x))那么我按预期得到(require value-of-x)
,但我无法弄清楚如何在那里得到报价。
编辑:这是我的问题的一个更简单的例子:
(defmacro q [x] `(str ~x))
=> (map (fn [e] (q e)) (map symbol ["x" "y" "z"]))
=> ("x" "y" "z")
然而,
(defmacro q [x] `(str '~x))
=> (map (fn [e] (q e)) (map symbol ["x" "y" "z"]))
=> ("e" "e" "e")
答案 0 :(得分:2)
你需要的只是再次引用这个论点,如下:
(defmacro r [x] `(require '~x))
应该这样做。
编辑:上面的代码不起作用,因为在编译时,当扩展宏时x不可知。
但是,现在我考虑一下,为什么不直接调用require而不使用宏?
这似乎有效:
(require (symbol "clojure.walk"))
这有帮助吗?
答案 1 :(得分:0)
(defmacro r [x] `(require (quote ~x)))