2013-02-20 39 views
4

我最近一直在試圖用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並使用它。

有沒有辦法讓代碼在兩個文件之間拆分,同時仍然可以在運行時更改代碼?

回答

3

將var更新傳遞給var,而不是當前包含在var更新中的函數,方法是將#'放在var名稱的前面。這會在每次調用var時在var中查找更新函數的內容。

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

這有可能表現非常輕微的成本,這就是爲什麼它是不是默認的,雖然它是在這樣的情況下非常有用,成本很小。

相關問題