Avergonzosamente, estoy teniendo problemas para diseñar correctamente esta macro.Problema con esta macro
Esta es la macro como lo tengo escrito:
(defmacro construct-vertices
[xs ys]
(cons 'draw-line-strip
(map #(list vertex %1 %2) xs ys)))
Se tiene que tomar en dos colecciones o SEQs, xs
y ys
, y necesito que me dé ...
(draw-line-strip (vertex 0 1) (vertex 1 1)
(vertex 3 3) (vertex 5 6)
(vertex 7 8))
... para xs
= [0 1 3 5 7]
y ys
= [1 1 3 6 8]
.
Esto funciona bien si le doy mi macro llanura 'n' vectores simples (por ejemplo [1 2 3 4]
y [2 3 4 5]
) pero no funciona si le doy un perezoso-ss/cualquier cosa que necesita ser evaluado como (take 16 (iterate #(+ 0.1 %1) 0))
y (take 16 (cycle [0 -0.1 0 0.1]))))
.
Me doy cuenta de que esto se debe a que se transfieren a la macro sin evaluar, por lo que obtengo, por ejemplo, (vertex take take)
como primer resultado (creo). Desafortunadamente, todo lo que he intentado primero para evaluar estos y luego llevar a cabo mi macro-reescritura ha fallado/se veía terriblemente hacky.
Estoy seguro de que me falta algún tipo de patrón básico de sintaxis-comillas/comillas aquí-¡Me encantaría alguna ayuda/consejos!
Muchas gracias.
EDITAR Debo mencionar, draw-line-strip
es una macro y vertex
crea un vértice OpenGL; ambos son parte de Penumbra Clojure+OpenGL library.
EDIT 2 Esto es para una herramienta gráfica personalizada que necesito, y la motivación principal para crearla era ser más rápido que JFreeCharts y compañía.
EDITAR 3 supongo que debería señalar que hacer tienen una versión de trabajo macro, es simplemente horrible y hacky como he mencionado anteriormente. Utiliza eval
, como se demuestra a continuación, pero como esto:
(defmacro construct-vertices
[xs ys]
(cons 'draw-line-strip
(map #(list vertex %1 %2) (eval xs) (eval ys))))
Por desgracia, me sale ...
error: java.lang.ClassFormatError: Invalid this class index 3171 in constant pool in class file tl/core$draw_l$fn__9357 (core.clj:14)
... al usar esto con unos pocos miles-elemento de la lista (s) de largo. Esto se debe a que estoy escribiendo demasiado en el código precompilado, y el archivo de clase no puede manejar (supongo) tantos datos/códigos. Parece que necesito, de alguna manera, obtener una versión de función de draw-line-strip
, como se ha sugerido.
Todavía estoy abierto, sin embargo, a una solución macro más elegante, menos hackosa, para este problema. ¡Si existe uno!
¿por qué no escribir una función en su lugar? –
Porque, hasta donde sé, ¡eso no es posible! Tengo estas matrices 'xs' y' ys', y necesito reformatearlas, en cierto sentido, dentro de una 'draw-line-strip', y envueltas en' vertx'es. También estoy interesado en hacer esto con una macro, aunque estaría más que feliz de ver una solución usando una función también. – Isaac
En realidad, no solo es posible escribirlo como una función (ver la respuesta de Dev er dev), sino que es imposible escribirlo como una macro y hacer que funcione con argumentos seq arbitrarios (considere que la expansión de la macro debe estar completamente determinada cuando se compila el código). –