考虑clojure中这个非常简单的函数定义:
(defn prompt []
(print ">>> ")
(read-line))
我的目标是让用户输入一个由提示前缀前缀前缀的字符串。然而,read-line
似乎在print
语句之前执行。但是,通过刷新输出流
(defn prompt []
(print ">>> ")
(flush)
(read-line))
此函数按预期工作。为什么我必须手动冲洗出为了">>>"被写出来?根据文档,函数和do
应该依次执行表达式
它们按顺序执行。但是执行print
并不意味着给定的输出将刷新到*out*
变量所指向的任何流。正如文档所说,print
函数
将当前值的对象打印到输出流的* *。
默认情况下,*out*指向PrintWriter
,通常是System.out
的目标。对于PrintWriter
实例,默认情况下不启用刷新。但是,您可以通过使用某些构造函数来创建实例来启用自动刷新。
即使这样,对于PrintWriter
实例:
如果启用了自动刷新,则仅在调用println、printf或format方法之一时执行刷新,而不是在碰巧输出换行符时执行刷新。
您可以使用println
而不是print
来理解您的意思:
(defn prompt []
(println ">>> ")
(read-line))
不同之处在于(source print)
中pr
的使用,而(source println)
中prn
的使用。查看源代码: