在用户输入之前打印提示

Printing promt before user input

我是 OCaml 的新手,现在我正在尝试制作一个简单的 REPL。

let rec repl () = 
    print_prompt () ;
    let input = Scanf.scanf "%s" (fun x -> x) in
    if input = "" then repl ()
    else print_endline input

let print_prompt () = print_string "> "

我现在遇到的问题是:程序启动时,没有立即显示提示。它等待我的输入并打印提示以及我的输入。

我想要的是:

> "user_input"
"user_input"

但我得到了:

"user_input"
> "user_input"

我该如何解决这个问题?

好吧,你没有展示 print_promt 实现,但我可以猜测,它使用了一些缓冲 io 函数,如 print_stringprintf。它们打印到中间缓冲区中,除非调用 flush,否则不会显示数据。您可以使用 flushflush_all 函数手动执行此操作。您还可以在 printf 格式字符串中使用特殊说明符 %!

 open Printf

 let print_prompt () = printf "> %!" 

这几乎可以肯定是缓冲问题。在您的 print_prompt 函数中,刷新标准输出:

flush stdout

使用 readline 代替 Scanf :

val read_line : 单位 -> 字符串

刷新标准输出,然后从标准输入读取字符,直到遇到换行符。 Return读取的所有字符的字符串,末尾没有换行符。