【问题标题】:Clojure. Cursive. No debugger?克洛朱尔。草书。没有调试器?
【发布时间】:2019-12-31 12:38:49
【问题描述】:

我正在使用 Kyle Kingsbury 的“Clojure From the Ground Up”学习 Clojure

第一个练习是编写一个 Clojure 例程来测试给定的字符串是否是回文。

我写了一些递归的东西:

================================================ ===

我输入了各种 println 语句来调试它。

然后我发现 Cursive 有一个调试器! 我尝试使用它。 我无法让调试器在断点处停止。

我拉下 Run --> Debug... 并得到以下控制台输出:

================================================ ===

Connected to the target VM, address: '127.0.0.1:5994', transport: 'socket'
Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended


    Top  1234564321
    Nil?  1234564321
    Equal  1234564321

    Top  (2 3 4 5 6 4 3 2)
    Nil?  (2 3 4 5 6 4 3 2)
    Equal  (2 3 4 5 6 4 3 2)

    Top  (3 4 5 6 4 3)
    Nil?  (3 4 5 6 4 3)
    Equal  (3 4 5 6 4 3)

    Top  (4 5 6 4)
    Nil?  (4 5 6 4)
    Equal  (4 5 6 4)

    Top  (5 6)
    Nil?  (5 6)


Exception in thread "main" Syntax error compiling at (C:\Users\Joe Us-er\OneDrive\Chit\CChit\palin\src\palin\palin.clj:24:1).

与目标VM断开连接,地址:'127.0.0.1:5994',传输:'socket'

Process finished with exit code 1

================================================ ===

我不知道哪些是信息,哪些只是数据。 现在,为什么我的程序没有在任何断点处停止? 谢谢。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

2020 年 1 月 1 日 好的。我接受了你的建议,写了一些更简单的东西。 而且仍然没有断点。 这是屏幕截图:

请注意,“Top”和“Bottom”都会被打印出来,但不会遇到断点。

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

1/2/2020 又是“愚蠢”,没有语法错误,也没有遇到任何断点。

我应该引用某种特殊的命名空间进行调试吗?我似乎记得读过一些我不明白的东西。

或者“64 位服务器虚拟机警告”消息是否重要?

【问题讨论】:

  • 是的,我刚刚启动 IntelliJ 并注意到禁用的断点使用空心符号。我不确定错误是什么,但代码很糟糕。您不能像使用((println "Nil") (flush) true)) 那样使用() 进行任意分组。这将尝试将println (nil) 的返回作为函数调用。 () 中的第一个符号/对象是要调用的函数。
  • 你的程序是错的。它试图在 if 分支中将 println 的结果作为函数调用。我想它只是没有到达断点的行。如果分支使用do 将副作用行分组
  • @LionelGoulet ,对不起,我正忙于新年,同时发表评论。您的屏幕截图显示了if 的真正分支的以下内容(让我以更传统的方式对其进行格式化):((println "Nil") (flush) true))。因为 lisp 中的括号不是对语句进行分组的语法(与 java/c++/js 中的 { } 不同...),而是调用函数的语法,该函数是带有 args 的列表的头部,即尾部。如果表单也是函数调用,请先调用它们,从左到右。
  • 话虽如此,我们可以将这一行读为:“调用 println 并使用参数“Nil”,然后调用不带 args 的 flush,然后调用 first(println 调用,返回 nil)的结果为具有 arg1 == 刷新调用结果(返回 nil)和 arg2 == true 的函数。所以它把我们引向了这个:(nil nil true) => Exception,这同样适用于 false if 分支,以及内部 if。所以你需要做的是,使用分组运算符逐行执行语句,即do:(do (println "Nil") (flush) true),它逐行执行代码,返回最后一条语句的结果
  • so (do ...) if 或多或少类似于其他语言中的 { },不同之处在于它还返回一个值(某些语言,例如 rust,也为 {} 块执行此操作)。

标签: recursion clojure palindrome cursive


【解决方案1】:

找到了!我的代码中缺少的是初始命名空间声明。 一旦我把这条线放进去:

(愚蠢)

然后点击调试按钮,“愚蠢”程序在第一个断点处启动并停止!耶!

感谢 Daniel O King 在 Medium.com https://medium.com/@daniel.oliver.king 上发表的一次性评论“每个 Clojure 文件都以调用 ns 运算符开始”

我在其他任何地方都没有看到过这个记录。

【讨论】:

    猜你喜欢
    • 2014-06-06
    • 2018-10-15
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多