OCaml函数调用的顺序错误

OCaml函数调用的顺序错误,ocaml,Ocaml,对,这是一个奇怪的问题,让我大吃一惊。基本上,我正在开发一个构建系统,该系统允许您在主构建之前和之后运行shell命令。要执行这些命令,我只需要使用Sys.command。问题是,每当我使用该函数时,它都会改变函数的调用顺序。例如: Sys.command "echo 'Hi!'"; Printf.printf "second\n"; Sys.command "echo 'Bye!'" 输出 Hi! Bye! second 从REPL和编译的可执行文件。然而,如果我使用任何其他功能,它似乎工

对,这是一个奇怪的问题,让我大吃一惊。基本上,我正在开发一个构建系统,该系统允许您在主构建之前和之后运行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表达式是按可预测的顺序执行的。你可以相信这一点。如果事情似乎没有按顺序进行,那么还有其他事情在发生


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

这是正确的顺序。你期望的是什么?嗯,我期望它按照调用函数的顺序运行(“嗨!”->“…”->“再见”)。为什么它不从头到尾调用函数呢?在您当前的示例中,您会回显Hi,然后是新行,然后是Bye,这是输出。如果你想要一个额外的空间,你需要2个新行字符。所以如果你想展示其他东西,你应该编辑你的例子…@matrixanomaly我编辑它是为了更清楚地展示我的意思。最后一次函数运行总是
Printf.Printf
,即使它按顺序排在第二位。