宏引用和不引用

时间:2013-04-12 03:00:41

标签: clojure

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

2 个答案:

答案 0 :(得分:2)

你需要的只是再次引用这个论点,如下:

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

应该这样做。

编辑:上面的代码不起作用,因为在编译时,当扩展宏时x不可知。

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

这似乎有效:

(require (symbol "clojure.walk"))

这有帮助吗?

答案 1 :(得分:0)

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