如何在clojure中创建简单的userprompt

如何在clojure中创建简单的userprompt,clojure,stream,flush,Clojure,Stream,Flush,考虑clojure中的这个非常简单的函数定义: (defn prompt [] (print ">>> ") (read-line)) 我的目标是让用户输入一个以提示前缀为前缀的字符串。但是,似乎在执行print语句之前执行了readline。但是,通过刷新输出流 (defn prompt [] (print ">>> ") (flush) (read-line)) 此功能按预期工作。为什么我必须手动刷新才能写出“>>>”?根据文档,函

考虑clojure中的这个非常简单的函数定义:

(defn prompt []
  (print ">>> ")
  (read-line))
我的目标是让用户输入一个以提示前缀为前缀的字符串。但是,似乎在执行
print
语句之前执行了
readline
。但是,通过刷新输出流

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

此功能按预期工作。为什么我必须手动刷新才能写出“>>>”?根据文档,函数和
do
应该按顺序执行表达式。

您可以使用
println
而不是
print
来理解您的意思:

(defn prompt []
  (println ">>> ")
  (read-line))

区别在于
(源打印)
(源打印ln)
中使用了
pr
。看看源代码。

它们是按顺序执行的。但是执行
print
并不意味着给定的输出将被刷新到
*out*
变量指向的任何流。正如文档所说,
打印
功能

将对象打印到作为当前值的输出流 在*外*

默认情况下,*out*指向通常是
System.out
目标的。对于
PrintWriter
实例,默认情况下不启用刷新。尽管如此,您可以通过用于创建实例来启用自动刷新

即使如此,对于
PrintWriter
实例:

如果启用了自动刷新,则仅当调用println、printf或format方法之一时,而不是在输出换行符时,才会执行自动刷新


这是任何语言的缓冲输出的常见情况。甚至C++也有冲洗功能。缓冲输出旨在通过失去程序流和输出之间的同步来提高性能。因此,如果要确保输出已打印,则需要刷新。