Peinlicherweise habe ich Probleme, dieses Makro richtig zu entwerfen. Probleme mit diesem Makro
Dies ist das Makro wie ich es geschrieben:
(defmacro construct-vertices
[xs ys]
(cons 'draw-line-strip
(map #(list vertex %1 %2) xs ys)))
Es muss in zwei Sammlungen oder ASTA nehmen, xs
und ys
, und ich brauche es mir zu geben ...
(draw-line-strip (vertex 0 1) (vertex 1 1)
(vertex 3 3) (vertex 5 6)
(vertex 7 8))
... für xs
= [0 1 3 5 7]
und ys
= [1 1 3 6 8]
.
Dies funktioniert gut, wenn ich meine Makro Ebene ‚n‘ einfache Vektoren geben (z [1 2 3 4]
und [2 3 4 5]
) aber funktioniert nicht, wenn ich ihm ein faules-Seq/alles dafür geben, die wie (take 16 (iterate #(+ 0.1 %1) 0))
und (take 16 (cycle [0 -0.1 0 0.1]))))
ausgewertet werden muss.
Ich weiß, dass dies daran liegt, dass diese auf das Makro unevaluated übergeben werden, und so bekomme ich zum Beispiel (vertex take take)
als mein erstes Ergebnis (glaube ich). Leider hat alles, was ich versucht habe, diese zuerst zu bewerten und dann mein Makro-Rewriting auszuführen, gescheitert/schrecklich hacky ausgesehen.
Ich bin sicher, dass ich hier ein paar grundlegende Syntax-Zitat/Anführungsstrich-Muster vermisse-ich würde einige Hilfe/Zeiger lieben!
Vielen Dank.
EDIT ich erwähnen sollte, ist draw-line-strip
ein Makro, und vertex
schafft eine OpenGL Vertex; sie sind beide Teil der Penumbra Clojure+OpenGL library.
EDIT 2 Dies ist für ein benutzerdefiniertes Grafik-Tool, das ich brauche, und die primäre Motivation für die Erstellung war es, schneller zu sein als JFreeCharts und Unternehmen.
EDIT 3 Ich nehme an sollte ich anmerken, dass ich eine Makro-Version Arbeits tun, es ist einfach schrecklich und Hacky, wie ich oben erwähnt. Es verwendet eval
, wie unten gezeigt, aber wie folgt aus:
(defmacro construct-vertices
[xs ys]
(cons 'draw-line-strip
(map #(list vertex %1 %2) (eval xs) (eval ys))))
Leider bekomme ich ...
error: java.lang.ClassFormatError: Invalid this class index 3171 in constant pool in class file tl/core$draw_l$fn__9357 (core.clj:14)
... wenn dies mit ein paar tausend Stück lange Liste mit (s). Dies liegt daran, dass ich viel zu viel in den vorkompilierten Code schreibe, und die Klassendatei kann (so wie ich denke) nicht so viele Daten/Codes verarbeiten. Es sieht so aus, als müsste ich irgendwie eine Funktionsversion von draw-line-strip
erhalten, wie es vorgeschlagen wurde.
Ich bin jedoch offen für eine elegantere, weniger hackische, Makro-Lösung für dieses Problem. Wenn einer existiert!
warum schreiben Sie stattdessen eine Funktion? –
Denn soweit ich weiß, ist das nicht möglich! Ich habe diese 'xs'- und' ys'-Arrays, und ich muss sie in einem gewissen Sinne innerhalb eines 'draw-line-strip' neu formatieren und in' vertex'-Symbole einschließen. Ich bin auch daran interessiert, dies mit einem Makro zu tun, obwohl ich mehr als glücklich wäre, eine Lösung zu sehen, die auch eine Funktion verwendet. – Isaac
Eigentlich ist es nicht nur möglich, es als eine Funktion zu schreiben (siehe Dev-Dev-Antwort), aber es ist tatsächlich unmöglich, es als ein Makro zu schreiben und es mit arbiträren Seq-Argumenten arbeiten zu lassen (beachten Sie, dass die Expansion des Makros vollständig bestimmt werden muss) wenn der Code kompiliert ist). –