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

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

(ns itervals)

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

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

Ответы [ 2 ]

7 голосов
/ 18 января 2011

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

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

(multidef 128)

i0   ; 0 
i127 ; 127 
i128 ; unable to resolve

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

4 голосов
/ 18 января 2011

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

(for [i (range 1 129)]
    (eval `(def ~(symbol (str "i" i)) ~i)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...