Я пытаюсь (в качестве упражнения для самообучения) создать макрос Clojure, который будет генерировать код для применения функции к последовательности целых чисел и суммирования результата, например
f(0) + f(1) + f(2) + f(3)
Это моя попытка:
(defmacro testsum [func n]
`(fn [x#] (+ ~@( map (fn [i] `(~func x#)) (range n)))))
Однако, похоже, что-то идет не так с x # gensym, и я получаю две разные версии x, и, следовательно, функция не работает:
(macroexpand '(testsum inc 3))
дает:
(fn* ([x__809__auto__]
(clojure.core/+
(inc x__808__auto__)
(inc x__808__auto__)
(inc x__808__auto__))))
Это в значительной степени именно то, что я хочу, кроме различных версий x 809 и 808 ...
Что я делаю неправильно? Я думал, что автогенсим предназначен для создания единого уникального символа именно для этой цели? Есть ли лучший способ сделать это?