gpt4 book ai didi

macros - 这个宏有问题

转载 作者:太空宇宙 更新时间:2023-11-03 18:35:00 24 4
gpt4 key购买 nike

很尴尬,我在正确设计这个宏时遇到了一些问题。

这是我写的宏:

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

它需要接收两个集合或序列,xsys,我需要它给我……

(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]),这就很好用了,但是没有如果我给它一个惰性序列/任何需要评估的东西,比如 (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 library 的一部分.

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

EDIT 3 我想我应该注意到我确实有一个宏版本在工作,正如我上面提到的那样,它只是可怕和骇人听闻。它使用 eval,如下所示,但像这样:

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

不幸的是,我得到...

错误:java.lang.ClassFormatError:类文件 tl/core$draw_l$fn__9357 (core.clj:14) 中的常量池中此类索引 3171 无效

…当将它与几千个项目的长列表一起使用时。这是因为我在预编译代码中写入了太多内容,而类文件无法处理(我想)那么多数据/代码。看来我需要以某种方式获取 draw-line-strip 的函数版本,正如所建议的那样。

不过,我仍然愿意采用更优雅、更简洁的宏观解决方案来解决这个问题。如果存在的话!

最佳答案

我查看了 draw-line-strip 的宏扩展,注意到它只是将主体包裹在绑定(bind)、gl-begin 和 gl-end 中。因此,您可以将任何代码放入其中。

所以

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

应该可以。

关于macros - 这个宏有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3357308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com