OCaml 函数调用顺序错误

OCaml function calls happening in wrong order

是的,所以这是一个让我大吃一惊的奇怪问题。基本上,我正在开发一个构建系统,让您可以在主构建之前和之后选择 运行 shell 命令。要执行这些命令,我​​只使用 Sys.command。问题是每当我使用该函数时,它都会改变调用函数的顺序。例如:

Sys.command "echo 'Hi!'";
Printf.printf "second\n";
Sys.command "echo 'Bye!'"

产出

Hi!
Bye!
second

来自 REPL 和编译后的可执行文件。但是,如果我使用任何其他功能,它似乎工作正常。有趣的是,如果我定义一个函数来调用 Sys.command 它仍然以错误的顺序执行。我已经在 GNU/Linux 上的 4.02.1 运行 和 Cygwin 中的 4.01.0 上进行了测试,并且在两者上都获得了相同的行为。据我所知 ; 不影响调用顺序。我在这里遗漏了什么吗?

您遇到了缓冲问题。

试试这个:

Sys.command "echo 'Hi!'";
Printf.printf "second\n%!";
Sys.command "echo 'Bye!'"

%! 说明符表示在此时刷新缓冲区。

因为它是一种混合范式语言(有副作用),所以 OCaml 表达式以可预测的顺序执行。你可以依靠这个。如果事情似乎没有按顺序执行,那么还有其他事情正在发生。

(作为旁注,请注意函数参数的求值顺序不受限制。)