Как вы программно создаете несколько определений времени компиляции в clojure?

Я хочу создать несколько определений в файле во время компиляции без необходимости вводить все. Я хотел бы сделать что-то вроде:

(ns itervals)

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

Таким образом, мы определяем переменные i1,..., i128 в текущем контексте. Я не могу найти способ сделать это во время компиляции, не определяя их все явно. Я думаю, что можно использовать макросы, но я понятия не имею, как это сделать.

2 ответа

Решение

Это больше похоже на время компиляции:

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

(multidef 128)

i0   ; 0 
i127 ; 127 
i128 ; unable to resolve

Но я не могу придумать тест, который покажет разницу, поэтому, возможно, различие неверно.

Попробуй это:

(for [i (range 1 129)]
    (eval `(def ~(symbol (str "i" i)) ~i)))
Другие вопросы по тегам