【发布时间】: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