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)
作为我的第一个结果(我相信).不幸的是,我试图首先评估这些然后执行我的宏重写的一切都失败/看起来非常hacky.
我确定我在这里缺少某种基本的语法 - 引用/非引导模式 - 我会喜欢一些帮助/指针!
非常感谢.
编辑我应该提一下,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
,正如所建议的那样.
不过,对于这个问题,我仍然是一个更优雅,更少黑客的宏观解决方案.如果存在!
我查看了 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)
应该管用。