【问题标题】:Clojure debuggingClojure 调试
【发布时间】:2017-09-27 07:37:41
【问题描述】:

如何调试clojure?是否有类似的工具,如 java 的 Eclipse 调试器,或者我必须去穷人的解决方案并使用 REPL 和打印语句来跟踪错误?

如果是后者,我怀疑功能范式的好处是否超过了原始/缺乏工具?毕竟,让 Java 如此出色的不是语言,而是帮助编码、重构和调试的优秀工具。只有 clojure 显示晦涩的 java 堆栈跟踪而不是翻译错误消息来发现问题这一事实让我感到警觉。

我不禁觉得clojure生态系统是不完整的,在生产中使用它会弊大于利。想象一下,一个新手从别人编写的 clojure 中调试一个错误,而没有适当的工具来插入代码。

我真的很想学习这门语言,希望我的印象是错误的。从语法上讲,这种语言简单且统一,让人感觉很舒服。

【问题讨论】:

    标签: debugging clojure functional-programming


    【解决方案1】:

    在 Clojure 中,您不需要像静态语言那样的调试器。 只需使用 REPL,评估编辑器中的任何表达式并立即获得答案。 通过在 REPL 中运行它,从第一行代码开始与开发系统对话。这是完全不同的哲学。您需要带有热键的编辑器将代码发送到 REPL。不要像在其他语言中那样在 REPL 中编写代码。 Stu Halloway 的最佳讨论https://www.youtube.com/watch?v=Qx0-pViyIDU

    此外,您可以使用 clojure.core 中的 tap> 函数在任何代码行中打印值。示例如下:https://gist.github.com/mikeananev/346cd6084d98381e7cf1378ef423a56a

    【讨论】:

      【解决方案2】:

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

      在来到 Clojure(来自 Python、Ruby 等)之前,我通常不会 打扰调试器。但我使用 CIDER 的调试器 (Emacs) 时间并发现它的简单性和简单的设置非常有用(关键 序列C-u C-c C-c)。有一个不错的小 GIF 演示 在 the CIDER project page(和 如下所示),以及广泛的 8 分钟 video demo here。自从 Clojure 鼓励小 和 referentially transparent functions, 对许多功能而言,测试和可调试性都是直截了当的。

      在 GIF 中需要注意的是,代码在您的实际代码缓冲区中以n 逐步执行,中间结果显示在右侧内联。自创建 GIF 以来,现在包含了更多功能。

      Cider 还具有 “enlighten-mode”,可以就地向您展示价值观 评估后。这是一个不错的 gif example。它 与调试模式类似,您需要将其打开 (M-x cider-enlighten-mode),然后 eval 并运行该函数。

      除此之外,还有 Sayid debugger and profiler。这 视频有一个非常详细的演练。有点复杂但是 看起来很强大,也进入了分析。比尔显然是 致力于使其在 Emacs 中运行良好,但也有努力 使其与 Vim/Fireplace 一起工作; 见vim-sayid

      This 是 一篇不错的调试文章,其中提到了 ol'println 方法, 还有spyscopeclojure.tools.trace, 其他有用的方法。

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

      【讨论】:

        【解决方案3】:

        emacs 有调试功能,IntelliJ+Cursive 有调试功能,Eclipse 等等。谷歌搜索其中任何一个都会产生更多信息。我使用的是 intelliJ,它的调试器功能齐全而且很好,甚至可以在 clojure 和 java 核心代码中放置断点。

        最初我使用带有 clojure 的调试器,每隔几个月我会在问题似乎需要时将其拉出。但调试器并不是他们想象中的全部。例如,在处理异步代码时,调试器不是很有帮助。 REPL 驱动(和测试驱动)开发比 java 等语言所需的传统“编译和运行”过程具有很大优势,并且几乎不需要调试器。

        Clojure 堆栈跟踪只是 java 堆栈跟踪,其中混入了 clojure 代码。如果 java 堆栈跟踪不会让您流血,那么 clojure 应该不会更糟。堆栈跟踪的问题似乎在于人们实际上并没有阅读它们。

        我不同意你们关于 Java 的 cmets; Java 有许多优点,首先是它的普遍性源于“一次编写,随处运行”、一些非常好的核心库等等。但是重构和调试(几乎)与语言本身完全无关。我想说 Clojure 的工具非常简单。依赖关系很容易处理。简而言之,您不会因为调试器而选择语言,尽管上面提到的编辑器/IDE 有一些不错的可用。

        我们在遍布全球的大型主要生产系统上运行 clojure,许多其他公司也这样做。 Java 生态系统为关键系统的 clojure 提供了一个特别适合的主机。

        想象一个新人从别人写的 clojure 中调试一个错误......

        学习 clojure 和调试某些代码的新手可能在某些情况下想要使用上面提到的调试器之一,但在大多数情况下,他或她最好先了解正在发生的事情,更加熟悉 clojure,然后才诉诸调试器。

        【讨论】:

          【解决方案4】:

          我使用在 cider (emacs) 中找到的很棒的调试器,我听说 cursive (intellij) 也有一个非常好的调试器。

          就我个人而言,我发现 clojure 对生产代码同样适用。我可以将调试器连接到生产过程(如果需要),调试和重新定义事物以快速修复,而无需停止或重新加载过程。我发现这个工具很棒,emacs 非常强大,你有refactoring(如果你真的需要它,我几乎从不在 clojure 中使用它而不是在 java 中使用它)以及几乎任何你需要的东西。使用苹果酒甚至可以很好地显示堆栈跟踪。

          对我来说,现在,用 java 编写生产代码的想法让人做噩梦.. :)

          【讨论】:

          • 我必须考虑苹果酒。太糟糕了,我是 vim 人,从未接触过 emacs。
          • 一点也不,看看spacemacsevil-mode,它把你的emacs 变成了一个'vi',但是拥有所有emacs 的好处(而且伙计,有这么多..)
          • Intellij+Cursive 非常棒。 REPL 和调试器 Cursive 供应非常棒。 IntelliJ 现在已经宠坏了我的“次要 IDE”。
          • @TuomasToivonen:我想再次强调这一点,请查看SpacemacsCheck out my spacemacs config suited for Clojure
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-03
          • 1970-01-01
          • 1970-01-01
          • 2015-02-24
          • 2011-04-17
          相关资源
          最近更新 更多