2010-06-06 54 views
28

我正在用Clojure開發一個寵物項目,但不知道我是否可以加快我的工作流程。高效的Clojure工作流程?

我現在的工作流程(帶的Compojure)是:

  1. 開始斯旺克與lein swank
  2. 轉到Emacs,連接M-x slime-connect
  3. 逐個加載所有現有的源文件。這也啓動了一個Jetty服務器和一個應用程序。
  4. 在REPL中寫入一些代碼。
  5. 對實驗感到滿意後,寫一個我想到的構造完整版本。 Eval(C-c C-c)它。
  6. 將REPL切換到此構造所在的命名空間並對其進行測試。
  7. 切換到瀏覽器並使用受影響的頁面重新加載瀏覽器選項卡。
  8. 調整代碼,評估它,檢查瀏覽器。
  9. 重複上述任何操作。

有許多煩惱的吧:

  1. 我有Emacs和瀏覽器之間(或瀏覽器,如果我喜歡用多種瀏覽器測試模板的東西)所有的時間進行切換。有沒有一個常見的習慣自動化呢?我以前有一個JavaScript位可以連續重新加載頁面,但是當我必須與頁面交互超過幾秒鐘時,顯然它的效用是有限的。
  2. 當我試驗和編寫測試函數時,我的JVM實例變得「髒」。基本上命名空間被污染,特別是如果我重構和移動名稱空間之間的函數。這可能會導致符號衝突,我需要重新啓動Swank。我可以取消一個符號嗎?
  3. 重新啓動Swank後,我逐個加載所有源文件(C-c C-k)。我懷疑我做的都是錯的。
  4. 在REPL和文件編輯器之間切換可能有點刺激,特別是當我打開很多Emacs標籤頁時,還有瀏覽器。

我正在尋找方法來改善上述要點和整個工作流程,因此,如果您願意分享您的意見,我將不勝感激。

P. S.

我之前也使用Vimclojure,因此基於Vimclojure的工作流程也歡迎。

回答

19

不是一個完整的工作流程的描述,只是一些想法:

  1. 有可能從與ns-unmap功能的名稱空間中刪除一個VAR。爲了更加方便,可以在其上面構建一個undef宏,例如,像這樣:

    (defmacro undef [& syms] 
        `(do [email protected](map (fn [s] `(ns-unmap *ns* '~s)) syms))) 
    

    ns-unalias也可能是感興趣的。

  2. 沒有理由去通過舉辦命名空間只是做C-C C-K在他們每個人的文件;你可以在0123L你的REPL需要的名字空間。

    此外,如果您在輸入時煤泥REPL幾個字符,然後用M-P-/M-N瀏覽歷史,將只顯示匹配你手工輸入的文本的初始位的條目。這與Paredit兼容(後面的右括號不會成爲問題)。因此,如果您在開始時建立了一個巨大的需求 - (require '[foo :as f] '[bar :as b] '[clojure.contrib.sql :as sql] ...) - 那麼在重新啓動Swank之後,您只需鍵入類似(require '[f的文件,然後按M-p即可將該表單再次帶入REPL提示。無可否認,這可以通過多種方式實現自動化(例如,通過Swank REPL搜索配置文件,或者也可以將一個簡單的宏擴展爲合適的require表單,該表單可以在引入一個實用程序名稱空間之後使用該項目 - 特別是後者的想法很容易實現),但是我發現它對煩惱因素的影響很小,至今我還沒有對任何改進措施感到困擾。

  3. 您可以使用C-c C-z在SLIME-enabled緩衝區中彈出SLIME REPL窗口。另外,如果你還沒有,你應該嘗試使用ido。我傾向於使用在屏幕左側的窗口中打開的代碼緩衝區以及右側的REPL緩衝區;與windmove-leftwindmove-right綁定到一些方便的鍵,我傾向於很高興。如果我需要經常查看其他緩衝區,我使用額外的Emacs框架。順便說一句,我通常不會使用lein swank,我更喜歡我自定義的clojure-project函數(菲爾哈格爾堡原作的一個調整版本)。有時候,我覺得有必要改進它......也許我會在下次發生這種情況時處理每個項目的自動化問題import/require。 ;-)

5

我不知道雷音,但在Maven中,你可以指定REPL腳本(replScript配置PARAM)的名稱,允許指定將在REPL &斯旺克開始執行哪些命令...如果你的項目有獨立的命名空間,你可以使用clojure.contrib.find-namespaces中的函數來查找你的命名空間並加載它們......