我可以使用哪些技术来调试我的Clojure代码?

时间:2013-04-08 17:56:56

标签: clojure counterclockwise

我正在使用CounterClockWise在Windows 7操作系统上开发我的第一个Clojure项目。除了javascript(我不太熟悉),这是我的第一个动态类型语言。

构建我的项目最困难的部分是调试我遇到的问题。我一直在使用的技术是将println撒在一些地方以确认我的输入和输出是我想要的。

与Java相比,似乎很多Clojure函数接受了我认为的垃圾输入,并乐意返回nil。因此,您看到的运行时异常可能来自远离问题原因的许多功能。我的观点是,甚至很难知道放置println的位置。

而且,这些运行时异常输出的是已编译的代码行号,因此它们的信息量不大。我的大多数功能都是短暂的,没有副作用,但问题是我输入的是网页。有时函数的输入是原始的html,有时它是解析的html(通过enlive),有时它是一个链接列表(通过在解析的html上使用类似CSS的选择器)。这些输入可以是深度嵌套的,复杂的结构(即:地图列表的地图列表),因此手动构建它们并不容易。当你有一个没有指向问题的堆栈跟踪时,我几乎必须调试我的一半程序并找出如何为每个部分生成输入。这非常耗时。

在IRC频道,有人告诉我stacktrace library使调试变得更容易。它仍然指出许多函数远离输入错误的来源,但它仍然有用。我正在寻找更多这样的技术。我可以使用哪些技术来更好地调试代码?

2 个答案:

答案 0 :(得分:1)

由于Clojure中的大多数函数应该相当短(或分解为简短)并且通常在没有副作用的情况下工作,因此您可以始终单独使用Clojure REPL或为它们编写测试。

此外,您可以将Java调试器/断点与La Clojure插件一起用于IntelliJ IDEA - 有关使用IDEA运行的更多详细信息,请参阅我的答案:How to run/debug compojure web app via counterclockwise (or la clojure)。调试Clojure项目。

答案 1 :(得分:1)

如果在调用其他函数时垃圾输入/意外输出对您来说是一个问题,也许您可​​以稍微重构一下代码,以便将这些触点封装在自己的函数中并定义前/后条件。例如http://blog.fogus.me/2009/12/21/clojures-pre-and-post/

我确信你可以通过一些宏支持来编写更令人愉快的东西。虽然这可能会使堆栈跟踪更难阅读。