如何在函数内部使用宏?

时间:2014-10-28 02:20:17

标签: macros clojure

我为clojure创建了一个for循环宏(基于this answer),如下所示:

(defmacro for-loop [[sym init check change :as params] & steps]
 `(loop [~sym ~init value# nil]
    (if ~check
      (let [new-value# (do ~@steps)]
        (recur ~change new-value#))
      value#)))

现在,我想在一些函数中使用这个for循环,但我无法弄清楚如何在函数中使用它。有人可以指导我,或者给我一个例子,在函数内部简单使用它吗?

1 个答案:

答案 0 :(得分:2)

如果您通过将defmacro更改为defn将其转换为函数,那么,例如,

(for-loop '[i 0 (< i 10) (inc i)] '(* 2 i))

...生成(剥离命名空间限定符)

(loop [i 0 value__11639__auto__ nil]
  (if (< i 10)
    (let [new-value__11640__auto__ (do (* 2 i))]
      (recur (inc i) new-value__11640__auto__))
    value__11639__auto__))

研究这个以了解它的作用。