1

我有一个看起来像的功能,

(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。

4

3 回答 3

1

问题不是我想的那样。我阻塞了一个选择调用(在while循环中调用),这导致我的关闭函数出现问题,它结束了while循环。为选择添加超时修复它。

于 2013-03-06T18:35:55.840 回答
1

你有一个多余的 ) 在第一个 println 的末尾。

(defn app [server]
  (println "before while....")
  (while test
    while-body)
  (println "...after while."))

但由于这显然是您没有运行的示例代码,我预计问题出在您运行的代码。如果这不能解决问题,请按原样复制并粘贴该代码。

于 2013-03-06T07:59:40.437 回答
0

在 Clojure 函数定义中,最后要评估的是返回的内容,并且 (println ...) 返回 nil

于 2013-03-06T06:12:44.017 回答