Как вы программно создаете несколько определений времени компиляции в 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)))