OCaml 异常的执行顺序问题

Unusual order-of-execution problem with OCaml

我是 OCaml 新手。我写了这个非常简单的程序:

open Stdio

let getline = 
  match In_channel.input_line In_channel.stdin with
  | Some x -> x
  | None -> "No input"
;;

let () =
  printf "What's your name? ";
  printf "Hi, %s!" getline;;

及其几种变体。

你懂的。我询问用户的姓名并打印“嗨,[姓名]!”。

有效,但输出顺序错误。我用 dune 构建项目,运行 可执行文件,没有得到任何输入名称的提示,我输入它然后我立刻得到所有“你叫什么名字?嗨,[name]!”。

现在,我了解了 OCaml 中缓冲的基础知识。事实上,我记得前一段时间涉足 OCaml 时遇到了同样的问题。我清楚地记得读过这篇文章:

The strange order of code execution in OCaml

而且我几乎可以肯定添加“%!”工作了。我什至试过

Out_channel.flush stdout

在两个 printf 之间,它不起作用。我试过在第一个 printf 中添加一个“\n”。我已经在几个终端上试过了。

我敢肯定这真的很简单,可能只是基本语法。

您将 getline 定义为变量,而不是函数。

函数必须始终接受一个参数,尽管该参数可以是 ():

open Stdio

let getline () = 
  match In_channel.input_line In_channel.stdin with
  | Some x -> x
  | None -> "No input"
;;

let () =
  printf "What's your name? ";
  printf "Hi, %s!" (getline ());;