2010-07-13 43 views
5

我剛開始學習Clojure和Emacs。我有Clojure的箱運行Windows,我希望能在一個緩衝區寫代碼,然後在REPL運行它巡航能力不叫重新加載emacs中的Clojure文件

(use 'example.code) 

所有的時間。我知道C-C C-K,但它不會重新加載名稱空間。如果我使用

(in-ns 'example.code) 

更改它在repl中的命名空間它的工作原理。什麼是正確的方法來做到這一點?

回答

10

in-ns是正確的方法之一。

感覺最「正確」的方式是(require '[example.code :as ec]),並在REPL的user命名空間中工作;這樣,我的一次性實驗狀態留在userec/foo對我來說足夠方便(並且它明顯表明foo應該來自哪裏)。你總是可以說(require :reload-all 'example.code)(與use相同)來強制重新編譯。

而且,這裏有一個功能(從目前的命名空間)中刪除所有的映射,從一個給定的命名空間use在拉:

(defn unuse [ns] 
    (doseq [[n v] (ns-refers *ns*)] 
    (if (= (.. v ns name) ns) 
     (ns-unmap *ns* n)))) 

最重要的是你可以建立

(defn reuse [ns] 
    (unuse ns) 
    (remove-ns ns) 
    (use :reload-all ns)) 

和說(reuse 'example.code)接近你的名字空間的新開始。 (請注意,1.2的新功能,如deftype & defrecord介紹了一些複雜性......特別是,unuseimport ED類沒有影響 - 這包括記錄和deftype -created類型:reload-all還是引起了deftype等形式爲。重新編譯,但我記得碰到奇怪的情況下,這似乎不足夠......可能是我的錯誤,這些功能可能有些奧術方面,我還沒有充分探索。)

0

也許「髒」的方式只是簡單地用(ns'example.code)切換到repl中緩衝區的命名空間。骯髒的原因是你將緩衝區定義與repl混合。我認爲Marczyk的答案是正確的。

+0

另外in-ns是切換命名空間的「正確方法」,而不是ns。 ns應該只被調用一次來設置名稱空間及其所有的需求,用途和導入。完成後,使用in-ns切換命名空間。 – kotarak 2010-07-13 15:28:38

+0

你是對的,我想念in-ns,更適合repl – jneira 2010-07-13 18:35:03