Довольно смущающе, у меня возникли проблемы с правильной разработкой этого макроса.
Это макрос, как я его написал:
(defmacro construct-vertices
[xs ys]
(cons 'draw-line-strip
(map #(list vertex %1 %2) xs ys)))
Он должен принимать две коллекции или последовательности, xs
и ys
, и мне нужно, чтобы он дал мне…
(draw-line-strip (vertex 0 1) (vertex 1 1)
(vertex 3 3) (vertex 5 6)
(vertex 7 8))
… для xs
= [0 1 3 5 7]
и ys
= [1 1 3 6 8]
.
Это прекрасно работает, если я даю своему макросу простые и n простые векторы (например, [1 2 3 4]
и [2 3 4 5]
), но не работает, если я дам ему lazy-seq / что-то, что должно быть оценено как (take 16 (iterate #(+ 0.1 %1) 0))
и (take 16 (cycle [0 -0.1 0 0.1]))))
.
Я понимаю, что это потому, чтоони передаются макросу без оценки, и поэтому я получаю, например, (vertex take take)
в качестве моего первого результата (я верю).К сожалению, все, что я пытался сначала оценить, а затем выполнить переписывание макросов, провалилось / выглядело ужасно хакерским.
Я уверен, что здесь отсутствует какой-то базовый шаблон синтаксических кавычек / кавычек - я бы хотел получить помощь / указатели!
Большое спасибо.
РЕДАКТИРОВАТЬ Следует отметить, что draw-line-strip
- это макрос, а vertex
создает вершину OpenGL;они оба являются частью Penumbra Clojure + OpenGL библиотеки .
EDIT 2 Это для нужного мне графического инструмента, и основной мотивацией для его создания былобыть быстрее, чем JFreeCharts и компании.
РЕДАКТИРОВАТЬ 3 Полагаю, я должен заметить, что у меня do работает макро-версия, она просто ужасная и хакерская, как я упоминал выше.Он использует eval
, как показано ниже, но вот так:
(defmacro construct-vertices
[xs ys]
(cons 'draw-line-strip
(map #(list vertex %1 %2) (eval xs) (eval ys))))
К сожалению, я получаю…
error: java.lang.ClassFormatError: Invalid this class index 3171 in constant pool in class file tl/core$draw_l$fn__9357 (core.clj:14)
… при использовании этого с несколькимиДлинный список из тысячи предметов.Это потому, что я слишком много пишу в предварительно скомпилированный код, а файл классов не может обработать (я полагаю) такое количество данных / кода.Похоже, мне нужно каким-то образом получить версию функции draw-line-strip
, как было предложено.
Я по-прежнему открыт для более элегантного, менее хакерского, макро решения этой проблемы.Если таковой существует!