为什么我不能在Clojure的defn身体中打电话给println?

时间:2013-03-06 02:28:40

标签: clojure

我有一个看起来像

的功能
(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...")))

所以还有其他事情要发生。

编辑#2

在repl上测试更多,如果我注释掉while循环,则打印前后的println。关于'nil'之前我错了,这是在调用while之后调用的另一个函数的返回值。所以它似乎与while循环有关。

我注意到,如果我将while更改为

(loop []
  (if test
    (do things and recur...)
    (println "test failed")))

“测试失败”从不打印到repl。

3 个答案:

答案 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