2008-12-23 98 views
13

虽然涉足Clojure,但我写了一个非常基本的程序来回应用户输入的任何内容。然而,它不会以我认为是自然的方式运行。下面的代码:Clojure - 副作用发生故障

(defn goo [] 
    (print "echo> ") 
    (def resp (read-line)) 
    (print resp) 
) 

我希望代码可以这样运行了(对我来说在foo作为输入到read-line打字):

user=> (goo) 
echo> foo 
foonil 

而是回声和读线切换:

user=> (goo) 
foo 
echo> foonil 

为什么会发生这种情况?我错过了一个微妙的东西吗?

编辑:从乔的回答,更新的正确的解决办法是:

(defn goo [] 
    (print "echo> ") 
    (flush) 
    (def resp (read-line)) 
    (print resp) 
    (flush) 
) 

此外,冲洗是没有必要的,如果你使用println而不是print

回答

17

我对clojure一无所知,但这听起来像是缓冲区未被刷新的情况。找出打印后如何冲洗标准。 println函数可能会在每行结尾处刷新。尝试:

(defn goo [] 
    (print "echo> ") 
    (flush) 
    (def resp (read-line)) 
    (print resp) 
) 
+0

这做到了!打印完成后添加(刷新)。感谢您及时的回复! – 2008-12-23 03:10:02

13

此外,请不要使用“def”,除非你确实真的想要定义一个全局变量。用 “让”,而不是:

(defn goo [] 
    (print "echo> ") 
    (flush) 
    (let [resp (read-line)] 
    (print resp) 
    (flush))) 

,或者更短的

(defn goo [] 
    (print "echo> ") 
    (flush) 
    (print (read-line)) 
    (flush))