你如何以编程方式在clojure中创建多个编译时defs?

时间:2011-01-18 06:02:45

标签: clojure

我想在编译时在文件中创建多个def,而不必输入所有内容。我想做点什么:

(ns itervals)

(loop [i 0]
   (if (<= i 128)
       (do 
         (def (symbol (str "i" i)) i)
         (recur (+ i 1)))))

以这种方式,我们在当前上下文中定义变量i1,...,i128。我无法想出在编译时这样做的方法,而没有明确地定义它们。我认为宏可能是要走的路,但我不知道如何。

2 个答案:

答案 0 :(得分:7)

这更像是编译时间:

(defmacro multidef[n]   
    `(do ~@(for [i (range n)]
           `(def ~(symbol (str "i" i)) ~i))))

(multidef 128)

i0   ; 0 
i127 ; 127 
i128 ; unable to resolve

但是我想不出能够说出差异的测试,所以也许这种区别是错误的。

答案 1 :(得分:4)

试试这个:

(for [i (range 1 129)]
    (eval `(def ~(symbol (str "i" i)) ~i)))