0

我正在尝试编写一个宏来以编程方式要求一些命名空间,以便传入参数的结果为(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")
4

2 回答 2

2

您只需要再次引用该论点,如下所示:

(defmacro r [x] `(require '~x))

它应该可以解决问题。

编辑:上述内容不起作用,因为 x 在编译时未知,当宏展开时。

但是,现在我想一想,为什么不直接调用 require 而不使用宏呢?

这似乎有效:

(require (symbol "clojure.walk"))

这有帮助吗?

于 2013-04-12T03:43:39.793 回答
0
(defmacro r [x] `(require (quote ~x)))
于 2013-04-12T18:55:59.857 回答