我正在编写一个通用函数,要求用户输入,通过传递函数验证它,并在输入错误时显示一条消息。
我面临的问题是,在用户已经提供输入之后
由于我使用的是 使用IntelliJ IDEA的REPL,运行此命令会导致弹出输入提示。如果我在提示中输入 我正在使用 我真的需要能够在询问输入之前进行打印,以便用户知道被询问的是什么。 任何帮助都将不胜感激。 就像发布后的测试一样,我尝试将print
而不是println
,因此流缓冲是明显的罪魁祸首,但即使在打印后刷新,它仍然无法在正确的时间打印。这是问题的最简单的例子:(defn- fprint [message]
(print message)
(flush))
(defn simple-interact []
(fprint "123")
(fprint (read-line))
(fprint "456"))
abc
,则会立即打印123abc456
而不是部分打印; 之后 之后我才会打印123
。我已经给出了输入。print
而不是println
,因为我正在编写的真实函数显示给定的消息,如果初始消息是,我不想强制它打印换行符意图是一个提示。作为参考,这里是完整的功能和帮助:(defn- print-mesage? [message]
(and message (not= message "")))
(defn- fprint [message]
(print message)
(flush))
(defn- fprint? [message]
(if (print-mesage? message)
(fprint message)))
(defn restricted-ask-for-input
"Asks a user for input. Will repeatedly ask until their input is verified via validate-f.
The ask message is displayed once before input is first asked for.
The error message is displayed every time validation fails.
If either of the messages is empty, or falsey, they won't be printed.
The messages dont' have a newline added after them."
[ask-message error-message validate-f]
(fprint? ask-message)
(loop []
(let [in (read-line)]
(if (validate-f in)
in
(do
(fprint? error-message)
(recur))))))
fprint
更改为使用println
,而行为是相同的。