2

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

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

与 Java 相比,似乎很多 Clo​​jure 函数都接受了我认为是垃圾输入的内容并愉快地返回 nil。因此,您看到的运行时异常可能来自许多远离问题原因的函数。我的意思是,甚至很难知道把printlns 放在哪里。

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

在 IRC 频道上,有人告诉我堆栈跟踪库,它使调试变得更加容易。它仍然指出许多功能远离错误输入的来源,但它仍然很有帮助。我正在寻找更多这样的技术。我可以使用哪些技术来更好地调试我的代码?

4

2 回答 2

1

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

您还可以将 Java 调试器/断点与 IntelliJ IDEA 的 La Clojure 插件一起使用 - 请参阅我的回答:如何通过逆时针(或 la clojure)运行/调试 compojure Web 应用程序,了解有关使用 IDEA 运行和调试 Clojure 项目的更多详细信息。

于 2013-04-08T18:04:26.133 回答
1

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

我相信你可以通过一点宏支持让它变得更令人愉悦。尽管这可能会使堆栈跟踪更难阅读。

于 2013-04-08T19:21:32.803 回答