OCaml如何在从标准输入读取整数前先打印提示文本
问题原因
你遇到的现象是两个独立问题共同导致的:
- 你使用的
Format模块的printf默认自带独立的输出缓冲区,不会像标准库printf那样遇到换行符就自动刷新缓冲区。你打印的内容会暂存在缓冲区中,直到程序退出时才会统一输出到终端,所以会出现先等待输入、后打印所有内容的情况。 let a = xxx and b = yyy in是OCaml的并行绑定语法,该语法下多个绑定的右值会先被全部求值完成后才会完成变量绑定,且多个右值的求值顺序没有明确保证,不符合你需要先请求第一个变量、再请求第二个变量的顺序执行要求。
解决方案
你需要做两处修改:
- 每次调用
Format.printf后手动刷新缓冲区,也可以直接用格式化标记控制刷新:@?代表刷新缓冲区不换行,@.代表输出换行并立刻刷新缓冲区 - 把并行绑定的
and改为顺序的let绑定,保证两个输入请求按先后顺序执行
修改后的代码
open Format let ask_for_int name = printf "%s? @?" name; (* 刷新缓冲区不换行,用户输入会紧跟在问号后,符合预期显示效果 *) let inp = read_int () in printf "You have entered %d@." inp; (* 输出内容+换行+刷新缓冲区 *) inp ;; let () = printf "Hello World!@."; let myVar = ask_for_int "myVar" in (* 顺序绑定第一个变量 *) let myVar2 = ask_for_int "myVar2" in (* 第一个输入完成后再处理第二个变量 *) if myVar = 5 && myVar2 = 10 then printf "Ok@." else printf "Wrong@.";;
修改后运行即可实现你预期的交互效果。
内容的提问来源于stack exchange,提问作者Jov
相关产品推荐
相关产品推荐

