Clojure调试

8
如何调试Clojure?是否有类似于Java的Eclipse调试器的相关工具,或者我必须使用REPL和打印语句来跟踪错误?
如果是后者,我对函数式编程范式的好处是否超过了原始/缺乏工具的局限性持怀疑态度?毕竟,使Java变得如此出色的不是语言本身,而是优秀的工具来帮助编码、重构和调试。仅仅因为Clojure显示模糊的Java堆栈跟踪而不是翻译错误消息来定位问题,这让我感到不安。
我不禁觉得Clojure生态系统不完整,在生产中使用它会遇到更多的麻烦而不是好处。想象一下一个新手调试别人编写的Clojure代码时没有适当的工具可以进入代码。
我真的很想学习这门语言,希望我的印象是错误的。从语法上看,由于其简单性和一致性,这种语言感觉很舒适。
4个回答

8

我使用在cider (emacs)中发现的绝妙调试器,而且我听说cursive (intellij)也有一个非常好的调试器。

就我个人而言,我认为clojure对于生产代码来说一点也不逊色。如果需要的话,我可以连接到生产进程中的调试器,进行调试和重新定义,以便快速修复问题,而无需关闭或重新加载进程。我发现工具非常棒,emacs功能强大得令人难以置信,你还可以使用重构工具(如果真的需要,在clojure中我很少使用它,与java相比),几乎可以满足你的所有需求。即使是使用cider显示堆栈跟踪信息也非常出色。

对我来说,现在想要在java中编写生产代码会让我做噩梦.. :)


我必须考虑Cider。太糟糕了,我是vim用户,从未接触过emacs。 - Tuomas Toivonen
2
不要再犹豫了,试试spacemacsevil-mode吧,它们可以将你的emacs变成一个“vi”,但同时保留了所有emacs的优点(而且有很多...)。 - Shlomi
2
Intellij+Cursive 真是太棒了。Cursive 提供的 REPL 和调试器功能非常好。现在 IntelliJ 已经让我对其他“较差的 IDE”感到失望了。 - Carcigenicate
@TuomasToivonen:我想再次强调,看看Spacemacs查看适用于Clojure的我的spacemacs配置 - user2609980

7

emacs有调试功能,IntelliJ+Cursive有调试功能,Eclipse等其他编辑器也有。在谷歌上搜索任何一个这样的编辑器都会获得更多信息。我使用IntelliJ,它的调试器功能非常完整且易用,甚至可以在Clojure和Java核心代码中设置断点。

起初我使用调试器进行Clojure编程,但是每隔几个月才会拿出来使用,因为调试器并不总是那么好用。例如,当处理异步代码时,调试器并没有太大帮助。与传统“编译和运行”过程相比,基于REPL驱动(和测试驱动)的开发方式是一种很大的优势,它几乎消除了对调试器的需求。

Clojure的堆栈跟踪只是Java堆栈跟踪,其中夹杂着Clojure代码。如果Java堆栈跟踪已经让你头疼不已,Clojure堆栈跟踪应该不会更糟。问题在于人们似乎并不真正阅读它们。

关于Java,我不同意你的评论;Java有很多优点,首先是由于“编写一次,随处运行”的普及性,还有一些非常好的核心库等。但是重构和调试与语言本身(几乎)没有关系。而且我认为Clojure的工具很简单,依赖处理也很容易。总之,你不会因为一个调试器而选择一种语言,尽管上面提到的编辑器/IDE都有一些好的调试器可供使用。

我们将Clojure运行在跨越全球的大型生产系统上,并且许多其他公司也这样做。Java生态系统为Clojure提供了一个特别适合用于关键系统的主机。

想象一下,一个新手要调试别人编写的Clojure代码……

一个新手在调试某些代码时可能需要使用上述其中一个调试器,但在大多数情况下,他们更好地理解正在发生的事情,熟悉Clojure,然后才转向调试器。


6

Clojure有多个可用的调试器,以及一些聪明的方法来检测您的代码。

在转到Clojure之前(从Python、Ruby等),我通常不会使用调试器。但是我经常使用CIDER的调试器(Emacs),发现它非常简单易用,并且设置轻松(键序列C-u C-c C-c)。CIDER项目页面上有一个漂亮的小GIF演示(如下所示),还有一个8分钟的视频演示。由于Clojure鼓励编写小型和引用透明函数,因此对许多函数进行测试和调试非常简单。

cider debugging

那个GIF中需要注意的是使用n在实际的代码缓冲区中逐步执行代码,并在右侧内联显示中间结果。自创建该GIF以来,现在已经包含了更多功能。
Cider还有一个"enlighten-mode",可以在评估后在原地显示值。这里有一个漂亮的gif示例。它的工作方式类似于调试模式,您需要打开它(M-x cider-enlighten-mode),然后评估和运行函数。
除此之外,还有Sayid调试器和分析器。那里的视频是一个非常详细的演示。它有点复杂,但似乎非常强大,也涉及到分析。Bill显然致力于使其在Emacs中运行良好,但也有努力让其与Vim/Fireplace一起使用;请参见vim-sayid

这篇是一篇很好的调试文章,提到了老旧的println方法,以及spyscopeclojure.tools.trace等其他有用的方法。

你甚至可以使用datascope来获得图形化和格式良好的调试可视化,超越spyscope。


0
在Clojure中,您不需要像静态语言那样使用调试器。只需使用REPL,从编辑器中评估任何表达式并立即获得答案。通过在REPL中运行代码的第一行开始与开发系统交互,这是完全不同的哲学。您需要具有热键将代码发送到REPL的编辑器。不要像其他语言中那样在REPL中编写代码。关于这个最好的讨论来自Stu Halloway https://www.youtube.com/watch?v=Qx0-pViyIDU 此外,您可以使用clojure.core中的tap>函数在任何代码行中打印值。这里是一个示例:https://gist.github.com/mikeananev/346cd6084d98381e7cf1378ef423a56a

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接