OCaml函数调用以错误的顺序发生

时间:2015-07-04 03:05:05

标签: ocaml

是的,所以这是一个奇怪的问题,让我感到惊讶。基本上,我正在构建一个构建系统,它可以让你选择在主构建之前和之后运行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上测试了这一点,并且在两者上都获得了相同的行为。据我所知,;不会影响通话顺序。我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:6)

你有缓冲问题。

试试这个:

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

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

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

(作为旁注,请注意,函数参数的评估顺序不受约束。)