我有一个看起来像的功能,
(defn app [server]
(println "before while...."))
(while test
while-body)
(println "...after while."))
但是,当我调用 fn 时,我只会在 REPL 中看到“之前”,然后当该时间未通过测试时,“nil”。
如果我在 repl 上写一个测试 foo 就像
(defn foo []
(println "testing before")
(loop [i 100]
(when (> i 10)
(prn i)
(recur (- i 2))))
(println "after..."))
它按我的预期工作。
如果有帮助,我已将实际代码粘贴到此处https://www.refheap.com/paste/12147 。
是什么解释了这里的行为差异?
编辑
很抱歉之前没有尝试过,但这确实适用于 REPL:
(defn bar []
(let [i (atom 100)]
(println "before...")
(while (> @i 10)
(swap! i dec))
(println "after...")))
所以还有其他事情发生。
编辑#2
在 repl 进行更多测试,如果我注释掉 while 循环,将打印之前和之后的 println。我之前对“nil”有误解,这是在调用 while 之后调用的另一个函数的返回值。所以它似乎与while循环有关。
我注意到如果我将时间更改为此
(loop []
(if test
(do things and recur...)
(println "test failed")))
“测试失败”永远不会打印到 repl。