Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure-发生异常的副作用_Clojure - Fatal编程技术网

Clojure-发生异常的副作用

Clojure-发生异常的副作用,clojure,Clojure,当我涉猎Clojure时,我编写了一个非常基本的程序来响应用户输入的任何内容。然而,它并没有以我认为是自然的方式运行。代码如下: (defn goo [] (print "echo> ") (def resp (read-line)) (print resp) ) 我希望代码能像这样运行(对于我来说,输入foo作为readline的输入): 但是,回音和读取线路是切换的: user=> (goo) foo echo> foonil 为什么会发生这种情况?有没有我

当我涉猎Clojure时,我编写了一个非常基本的程序来响应用户输入的任何内容。然而,它并没有以我认为是自然的方式运行。代码如下:

(defn goo []
  (print "echo> ")
  (def resp (read-line))
  (print resp)
)
我希望代码能像这样运行(对于我来说,输入
foo
作为
readline
的输入):

但是,回音和读取线路是切换的:

user=> (goo)
foo
echo> foonil
为什么会发生这种情况?有没有我遗漏的微妙之处

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

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

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

(defn goo []
  (print "echo> ")
  (flush )
  (def resp (read-line))
  (print resp)
)
另外,请不要使用“def”,除非您真的非常想定义一个全局变量。使用“let”代替:

或者,更短

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

成功了!在指纹得到后添加(冲洗)。谢谢你的快速回复!酷。现在我有了一个用我不懂的语言检查过的答案。:-)很高兴我能帮上忙。技术好!出于对Clojure的好奇,但不了解stdout缓冲区的内部工作原理。。。为什么会出现这个问题?看起来很奇怪,排序可以在缓冲区内更改…我不知道结束,所以我只能猜测。内部缓冲区用于保持对文件系统的直接I/O量较低。但这种设计是在I/O速度很慢且没有人使用线程时为I/O选择的。在面向在线的终端上,只有当您按enter键时,数据才会发送到主机系统。这允许打字员在发送到主机系统之前编辑行缓冲区。人们不再使用终端,因此这种知识逐渐消失。(上周遇到一位程序员,他从未见过5.25英寸的软盘……)
(defn goo []
  (print "echo> ")
  (flush)
  (let [resp (read-line)]
    (print resp)
    (flush)))
(defn goo []
  (print "echo> ")
  (flush)
  (print (read-line))
  (flush))