2013-04-08 82 views
2

我使用CounterClockWise在Windows 7操作系統上開發我的第一個Clojure項目。除了JavaScript(我不太熟悉),這是我的第一個動態類型語言。我可以使用哪些技術來調試我的Clojure代碼?

構建我的項目最困難的部分是調試我遇到的問題。我一直在使用的技術是在地方噴灑println以確認我的輸入和輸出是我想要的。

與Java相比,似乎很多Clojure函數接受我認爲垃圾輸入並愉快地返回nil。因此,您看到的運行時異常可能來自遠離問題原因的許多功能。我的觀點是,甚至很難知道把println放在哪裏。

而且,這些運行時異常正在輸出編譯的代碼行號,所以它們的信息量不大。我的大多數功能都是短暫且無副作用的,但問題是我的輸入是網頁。有時,函數的輸入是原始html,有時候是解析html(通過enlive),有時候是鏈接列表(通過在解析的html上使用類似css的選擇器)。這些輸入可以是深層嵌套的,複雜的結構(即地圖列表地圖的列表),因此不容易手動建立它們。當你的堆棧跟蹤沒有指出問題時,我幾乎不得不調試一半程序,並找出如何爲每個部分生成輸入。這相當耗時。

在IRC頻道有人告訴我stacktrace library這使得調試更容易。它仍然指出許多功能遠離錯誤輸入的來源,但仍然有幫助。我正在尋找更多像這樣的技術。我可以使用哪些技術更好地調試我的代碼?

回答

1

由於Clojure中的大部分功能應該是相當短(或分解爲短)和平時的工作沒有副作用的影響,你總是可以分開的Clojure REPL試戴或編寫測試他們。

你也可以使用帶拉的Clojure插件的IntelliJ IDEA的Java調試器/斷點 - 看到我的回答:How to run/debug compojure web app via counterclockwise (or la clojure),詳細瞭解使用IDEA運行&調試Clojure的項目。

+0

我在OP中回答了這個問題,看看我的更新。謝謝 – 2013-04-08 18:15:07

+0

當然,在這種情況下,您已經描述過,使用IntelliJ IDEA的調試器可能是最好的解決方案。 您也可以使用clojure.tools.trace包跟蹤你的函數調用,但如果輸入/輸出參數都很大,我不認爲這將是可讀的。 – 2013-04-08 20:05:07

1

如果垃圾輸入/輸出意外是你的問題調用其他功能的時候,也許你可以讓這些接觸點被封裝在自己的功能與定義的前/後置條件調整你的代碼位。例如http://blog.fogus.me/2009/12/21/clojures-pre-and-post/

我相信你可以用一點點的宏支持來編寫更好的代碼。儘管這可能會使堆棧更難以閱讀。

+0

這是一個有用的功能,但是當我潛伏在IRC上時,我感覺大多數人沒有在他們的代碼中使用它。所以他們必須做些別的事情來讓他們更容易調試。 – 2013-04-08 21:06:55

相關問題