gpt4 book ai didi

opengl - Clojure 运行时编辑代码拆分为不同的文件

转载 作者:行者123 更新时间:2023-12-01 02:27:53 26 4
gpt4 key购买 nike

我最近一直在尝试使用 lwjgl 库在 Clojure 中测试 OpenGL。我从这个代码开始:

(ns test.core
(:import [org.lwjgl.opengl Display DisplayMode GL11]))

(defn init-window
[width height title]
(Display/setDisplayMode (DisplayMode. width height))
(Display/setTitle title)
(Display/create))

(defn update
[]
(GL11/glClearColor 0 0 0 0)
(GL11/glClear GL11/GL_COLOR_BUFFER_BIT))

(defn run
[]
(init-window 800 600 "test")
(while (not (Display/isCloseRequested))
(update)
(Display/update))
(Display/destroy))

(defn -main
[& args]
(.start (Thread. run)))

这在 emacs 中运行良好,使用 nREPL 插件,我可以启动它,并在它运行时更改某些内容(例如对 glClearColor 的调用)。

我决定把它分成两个单独的文件,这样我就可以重用 init-window功能 :
(ns copengl.core
(:import [org.lwjgl.opengl Display DisplayMode GL11]))
(defn init-window
[width height title]
(Display/setDisplayMode (DisplayMode. width height))
(Display/setTitle title)
(Display/create))

(defn mainloop
[{:keys [update-fn]}]
(while (not (Display/isCloseRequested))
(update-fn)
(Display/update))
(Display/destroy))

(defn run
[data]
(init-window (:width data) (:height data) (:title data))
(mainloop data))

(defn start
[data]
(.start (Thread. (partial run data))))

然后在一个单独的文件中
(ns test.core
(:import [org.lwjgl.opengl Display DisplayMode GL11])
(:require [copengl.core :as starter]))

(def -main
[& args]
(starter/start {:width 800 :height 600 :title "Test" :update-fn update})

但是,这不会让我在运行时改变。我必须关闭窗口然后执行 -main再次看到变化。

到目前为止,我已经尝试将最后两段代码摘录到一个文件中,但也没有奏效。但是,如果我将调用从 update-fn 更改为到我的更新函数的名称( update ),当它们在同一个文件中时,我可以在它运行时进行更改。

我猜这是因为当我创建带有更新函数的 map 时,它会传递实际的函数,所以如果我重新定义 update通过使用 nREPL 插件来评估它没有任何影响,因为 mainloop函数正在使用函数 - 不查找符号 update并使用它。

有没有办法在两个文件之间拆分代码,同时仍然可以在运行时更改代码?

最佳答案

通过放置 #' 将 var update 而不是当前包含在 var update 中的函数传递给它在 var 名称前面。这将导致每次调用时都会在 var 中查找更新函数的内容。

(def -main
[& args]
(starter/start {:width 800 :height 600 :title "Test" :update-fn #'update})

这对性能的影响很小,这就是为什么它不是默认设置的原因,尽管它在这种情况下非常有用并且成本很小。

关于opengl - Clojure 运行时编辑代码拆分为不同的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14988759/

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