visual studio microsoft español descargar community code-generation clojure macros symbol

code generation - studio - Controlar la generación de símbolos en las macros de Clojure



visual studio installer (1)

Estoy intentando (como ejercicio de autoaprendizaje) crear una macro de Clojure que genere código para aplicar una función a una secuencia de enteros y sumar 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 xy, por lo 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 más o menos exactamente lo que quiero aparte de las diferentes versiones 809 y 808 de x .....

¿Qué estoy haciendo mal? Pensé que el auto gensym estaba destinado a crear un solo símbolo único para exactamente este tipo de propósito. ¿Hay una mejor manera de hacer esto?


foo# gensimos de estilo foo# son válidos solo dentro de la sintaxis-cita donde fueron creados. En su código, los dos x# s se crean en diferentes bloques de sintaxis-cita:

(defmacro testsum [func n] `(fn [x#] (+ ~@( map (fn [i] `(~func x#)) (range n))))) ^- s-q1 ^-unquote ^- s-q2

Para solucionar esto, use una llamada explícita (gensym) :

(defmacro testsum [func n] (let [x (gensym "x")] `(fn [~x] (+ ~@(map (fn [i] `(~func ~x)) (range n))))))

Y la expansión macro ( (macroexpand ''(testsum inc 3)) ):

(fn* ([x4966] (clojure.core/+ (inc x4966) (inc x4966) (inc x4966))))