我有一个看起来像
的功能(defn app [server]
(println "before while...."))
(while test
while-body)
(println "...after while."))
然而,当我调用fn时,我只看到REPL中的“before while”,然后当while未通过测试时,“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...")))
所以还有其他事情要发生。
在repl上测试更多,如果我注释掉while循环,则打印前后的println。关于'nil'之前我错了,这是在调用while之后调用的另一个函数的返回值。所以它似乎与while循环有关。
我注意到,如果我将while更改为
(loop []
(if test
(do things and recur...)
(println "test failed")))
“测试失败”从不打印到repl。
答案 0 :(得分:1)
你在第一张println结尾处有一个天真的。
(defn app [server]
(println "before while....")
(while test
while-body)
(println "...after while."))
但是,由于这显然是您未运行的示例代码,我希望问题出现在 运行的代码中。请复制&如果这不能解决问题,请将代码完全按代码粘贴。
答案 1 :(得分:1)
问题不是我想的那样。我在select调用(在while循环中调用)上阻塞,这导致我的shutdown函数出现问题,结束了while循环。在select中添加超时会修复它。
答案 2 :(得分:0)
在Clojure函数定义中,要评估的最后一件事是返回的内容,而(println ...)返回nil