在用户输入之前打印提示



我是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"

我该怎么解决这个问题?

使用readline而不是Scanf:

val read_line:unit->字符串

刷新标准输出,然后从标准输入中读取字符,直到遇到换行符为止。返回读取的所有字符的字符串,末尾不包含换行符。

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

 open Printf
 let print_prompt () = printf "> %!" 

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

flush stdout

最新更新