【问题标题】:What are some techniques I can use to debug my Clojure code?我可以使用哪些技术来调试我的 Clojure 代码?
【发布时间】:2013-04-08 17:56:55
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: clojure counterclockwise


    【解决方案1】:

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

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

    【讨论】:

    • 当然,在您描述的这种情况下,使用 IntelliJ IDEA 的调试器可能是最好的解决方案。您还可以使用 clojure.tools.trace 包跟踪您的函数调用,但如果输入/输出参数很大,我认为它不可读。
    【解决方案2】:

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

    我相信您可以通过一点宏支持让编写代码变得更令人愉悦。虽然这可能会使堆栈跟踪更难阅读。

    【讨论】:

    • 这是一个有用的功能,但是当我潜伏在 IRC 上时,我感觉到大多数人并没有在他们的代码中使用它。所以他们必须做些别的事情来让他们更容易调试。
    猜你喜欢
    • 2017-01-16
    • 1970-01-01
    • 2011-10-24
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 2010-09-27
    相关资源
    最近更新 更多