Estoy tratando (como un ejercicio de autoconocimiento) para crear un Clojure macro que va a generar el código para aplicar una función a una secuencia de enteros y suma el resultado, por ejemplo,
f(0) + f(1) + f(2) + f(3)
Este es mi intento:
(defmacro testsum [func n]
`(fn [x#] (+ ~@( map (fn [i] `(~func x#)) (range n)))))
Sin embargo algo parece ir mal con el x# gensym y termino con dos versiones diferentes de x y, por tanto, la función no funciona:
(macroexpand '(testsum inc 3))
da:
(fn* ([x__809__auto__]
(clojure.core/+
(inc x__808__auto__)
(inc x__808__auto__)
(inc x__808__auto__))))
Esto es casi exactamente lo que quiero, aparte de los diferentes 808 809 y las versiones de x.....
¿Qué estoy haciendo mal? Pensé que el auto gensym fue el propósito de crear un único símbolo para este tipo de propósito? Hay una manera mejor de hacer esto?