Clojure REPL在要求输入之前不打印

时间:2016-10-06 16:27:32

标签: clojure

我正在编写一个通用函数,要求用户输入,通过传递函数验证它,并在输入错误时显示一条消息。

我面临的问题是,在用户已经提供输入之后

由于我使用的是print而不是println,因此流缓冲是明显的罪魁祸首,但即使在打印后刷新,它仍然无法在正确的时间打印。这是问题的最简单的例子:

(defn- fprint [message]
  (print message)
  (flush))

(defn simple-interact []
  (fprint "123")
  (fprint (read-line))
  (fprint "456"))

使用IntelliJ IDEA的REPL,运行此命令会导致弹出输入提示。如果我在提示中输入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,而行为是相同的。

0 个答案:

没有答案