我最近一直在試圖用lwjgl庫在Clojure中測試OpenGL。我開始了與此代碼:Clojure在運行時編輯代碼拆分爲不同的文件
(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
)的名稱,那麼它們在同一個文件中時,我可以在運行時更改它。
我猜這是因爲當我創建更新函數的地圖通過實際功能,所以如果我重新定義update
通過使用nREPL插件評估它沒有效果,因爲mainloop
函數正在使用該功能 - 不查找符號update
並使用它。
有沒有辦法讓代碼在兩個文件之間拆分,同時仍然可以在運行時更改代碼?