如何在clojure中创建简单的userprompt
考虑clojure中的这个非常简单的函数定义:如何在clojure中创建简单的userprompt,clojure,stream,flush,Clojure,Stream,Flush,考虑clojure中的这个非常简单的函数定义: (defn prompt [] (print ">>> ") (read-line)) 我的目标是让用户输入一个以提示前缀为前缀的字符串。但是,似乎在执行print语句之前执行了readline。但是,通过刷新输出流 (defn prompt [] (print ">>> ") (flush) (read-line)) 此功能按预期工作。为什么我必须手动刷新才能写出“>>>”?根据文档,函
(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++也有冲洗功能。缓冲输出旨在通过失去程序流和输出之间的同步来提高性能。因此,如果要确保输出已打印,则需要刷新。