2014-10-28 135 views
-1

我创建了一个for循环宏的Clojure(基于this answer),这是如下:如何在函数中使用宏?

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

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

+3

如果你不知道如何使用它,你是如何编写这个宏的?在函数内部使用它与从其他地方使用它非常相似。您有任何具体问题,或者您尝试过的方法无效吗? – amalloy 2014-10-28 02:51:14

回答

2

如果你把它变成一个功能,通过改变defmacrodefn,然后,例如,

(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__)) 

研究这看它能做什么。