Clojure - 发生故障的副作用

时间:2008-12-23 03:02:10

标签: 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

为什么会这样?我缺少一个微妙的东西吗?

编辑:根据Joe的回答,更新的正确解决方案是:

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

此外,如果您使用println代替print,则无需刷新。

2 个答案:

答案 0 :(得分:17)

我对clojure一无所知,但这听起来像是缓冲区没有被冲洗的情况。弄清楚打印后如何冲洗标准输出。 println函数可能在每行结束时刷新。尝试:

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

答案 1 :(得分:13)

另外,请不要使用“def”,除非你真的想要定义一个全局变量。改为使用“let”:

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

或更短

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