2010-12-13 43 views
4

對不起,很長的文章,但這個論壇總是要求用例:-)。Clojure REPL哲學和實用程序應用程序

我經常被要求爲我的組織編寫實用程序應用程序(GUI和命令行)。我最常用Java和最近的Scala寫這些。

Clojure(和其他Lisp)中的「哲學」似乎以REPL爲中心,我必須同意它創造了一個很好的開發環境,但我顯然不能生產那些需要用戶「安裝Clojure和Clojure-contrib,然後將該實用程序解壓縮到硬盤上的目錄中,使用以下類路徑從命令行啓動Clojure,...「。用戶不關心該實用程序是用Clojure編寫的。他們只想指向並點擊,或者至多鍵入「java -jar Utility.jar - ?」在命令行上。

我的問題圍繞着編譯和將應用程序分離到許多名稱空間/文件中。

我知道main方法必須是在包括(gen-class...)命令(或在ns命令:gen-class子句)一個Clojure的文件。對於額外的Clojure文件,我是否也應該這樣做?還是應該將它們保留爲打包在JAR中並由main文件加載的源代碼?在開發過程中如何測試REPL中的附加文件?我一直在使用leiningen,cake和maven來構建自包含的JAR(包含解包的clojure.jar,clojure-contrib.jar和commons-cli.jar文件),但到目前爲止,我一直在寫我的代碼與main方法相同的文件中。

回答

1

無論您將.clj AOT編譯爲.class,還是讓Clojure在運行時動態執行,都由您決定。總的來說,我發現在開發過程中避免使用AOT,並且只使用AOT作爲性能增強器,以適應在運行中編譯.clj的代價不合理的情況(有限的環境,例如Google App Engine或啓動時間的實用程序是至關重要的)。對於長時間運行的服務器進程,AOT編譯沒有太多優勢。

在開發時間使用AOT類時有很多複雜性,這些都是特定於不同開發環境的。

AOT的一個缺點是,你編譯的類可能與未來版本的Clojure不兼容,並且比你的clj文件更可能不兼容。隨着時間的推移這可能會變得更加重

1

當涉及到的分離,我讓他們在不同的命名空間/文件:

  • 一爲:gen-class命名空間,包含-main和所有其他類似Java的東西。
  • 所有函數的其他名稱空間。

理想情況下,你的主要應該包含正好從另一個命名空間中的函數調用,或者是一些邏輯,用於評估或args的重新包裝。

你的問題似乎很類似於邏輯代碼和UI代碼之間的分離。您可以看到名爲:gen-class的命名空間只是程序提供給Java代碼的界面,僅此而已。


當涉及到公用事業(如命令行,或Swing應用程序等),還有與Java一般,因爲JVM的一個麻煩的開始時間。

現在,你可以通過使服務器應用程序運行REPL在後臺所有的時間解決這個問題,並說,不知何故收到一個S-expr來進行評估,並返回結果。這可以作爲一個簡單的Web應用程序來完成,它接收一個s-expr作爲URL參數,並返回結果。現在,你可以使用普通的Java創建所有實用程序,甚至使用wget創建bash,因爲所有你需要做的就是訪問一個URL(假設帶有repl的服務器在後臺運行)。

很有可能像這樣的東西已經存在,所以如果有人知道 - 評論是非常值得歡迎的。

哦,還有一件事,在REPL webapp的暴露可能必須要封閉外界的端口,以防止Clojure的-注射:d

+0

不能做一個Web應用程序。我們在全國各地都有服務器 - 在防火牆之外,我需要在公司和總部運行公用事業。啓動時間從未成爲Java應用程序的問題;大多數是DB工具,它們會在查詢等方面做很多事情 - 數據庫通常是瓶頸。不過謝謝你的回答。 – Ralph 2010-12-13 21:57:27

+0

@Ralph:好的,我在下半部分添加了一條分隔與您的問題相關的上半部分,這不適用於您的情況。 – 2010-12-13 22:00:13