2011-03-23 48 views
5

我設置了一個leiningen項目。在一個clojure源文件中,我定義了一些記錄。我的工作流程通常是啓動emacs並連接到'lein swank'REPL。一旦我連接到REPL,我切換到適當的命名空間和C-C C-K文件,所以我可以開始使用REPL和文件中的代碼。但是,如果我對該文件中的記錄和C-C C-K中的記錄進行了更改,則REPL不會收到更改。clojure REPL不接受對defrecord進行的更改

因此,每當我需要對記錄進行更改時,我必須停止lein swank進程,重新啓動它,然後從emacs重新連接它。這個變老很快。我錯過了什麼?我試過C-C C-1而不是C-C C-K,但那不起作用。我嘗試刪除項目根目錄中的'class'目錄,但這也是一個禁忌。

我會很感激任何見解或建議。另外,順便說一句,我總是在定義記錄的命名空間中工作。

編輯:我實際上改變了defrecord中協議的實現。一旦我改變它並使用C-C C-k進行編譯,並在REPL中創建新記錄,REPL仍然使用舊的協議實現。

+0

你能在一個貼顯示舊值的repl片段,更改它然後新值。我認爲這將有助於增加背景,這樣我們可以幫助更多 – 2011-03-23 17:40:11

+0

@Arthur:我應該讓這個更清楚。我正在更改defrecord中協議的實現,並且當我做出更改時,REPL仍在使用舊的實現 - 即使在創建記錄的新實例之後。 – mofeeta 2011-03-23 18:13:40

+0

我只知道Common Lisp的Slime/Swank。我很驚訝你不使用'C-c C-c'編譯單獨的頂層表單。順便說一下,有'C-c〜'將REPL的包和目錄切換到當前文件和指針。 – Svante 2011-03-23 23:02:02

回答

4

我可以使用一個例子,但也許你正在改變記錄的定義,並查看在更改之前所做的某些記錄的實例?

如果您從repl中定義記錄的實例,然後更改defrecord,重新裝入repl,然後使用不同的名稱創建新的副本,您會看到兩個副本以及它們之間的差異。

我嘗試通過在我的項目中調用(use :reload-all ... all the namespaces in my project ...)然後我可以重新加載只是該文件和文件,以避免這種混亂的重裝,所有拋出舊變種綁定等