麻烦这个宏

Isa*_*aac 8 lisp macros clojure

令人尴尬的是,我在设计这个宏时遇到了一些麻烦.

这是我编写的宏:

(defmacro construct-vertices
  [xs ys]
  (cons 'draw-line-strip
        (map #(list vertex %1 %2) xs ys)))
Run Code Online (Sandbox Code Playgroud)

它需要接收两个集合或seqs,xs并且ys,我需要它给我...

(draw-line-strip (vertex 0 1) (vertex 1 1) 
                 (vertex 3 3) (vertex 5 6) 
                 (vertex 7 8))
Run Code Online (Sandbox Code Playgroud)

... for xs= [0 1 3 5 7]ys= [1 1 3 6 8].

如果我给我的微距平原"N"简单的载体(如这只是正常[1 2 3 4][2 3 4 5]),但如果我给它一个懒惰-SEQ /任何需要像被评估不工作(take 16 (iterate #(+ 0.1 %1) 0))(take 16 (cycle [0 -0.1 0 0.1])))).

我意识到这是因为这些被传递给未经评估的宏,所以我得到了,例如,(vertex take take)作为我的第一个结果(我相信).不幸的是,我试图首先评估这些然后执行我的宏重写的一切都失败/看起来非常h​​acky.

我确定我在这里缺少某种基本的语法 - 引用/非引导模式 - 我会喜欢一些帮助/指针!

非常感谢.

编辑我应该提一下,draw-line-strip是一个宏,并vertex创建一个OpenGL顶点; 它们都是Penumbra Clojure + OpenGL库的一部分.

编辑2这是我需要的自定义图形工具,创建它的主要动机是比JFreeCharts和公司更快.

编辑3我想我应该注意到我确实有一个宏版本工作,它就像我上面提到的那样可怕而且很丑陋.它使用eval,如下所示,但是像这样:

(defmacro construct-vertices
  [xs ys]
  (cons 'draw-line-strip
        (map #(list vertex %1 %2) (eval xs) (eval ys))))
Run Code Online (Sandbox Code Playgroud)

不幸的是,我得到......

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,正如所建议的那样.

不过,对于这个问题,我仍然是一个更优雅,更少黑客的宏观解决方案.如果存在!

dre*_*ish 4

我查看了 draw-line-strip 的宏扩展,发现它只是将主体包装在绑定、gl-begin 和 gl-end 中。所以你可以在里面放入你想要的任何代码。

所以

(defn construct-vertices [xs ys]
  (draw-line-strip
    (dorun (map #(vertex %1 %2) xs ys))))
Run Code Online (Sandbox Code Playgroud)

应该管用。