是的,所以这是一个奇怪的问题,让我感到惊讶。基本上,我正在构建一个构建系统,它可以让你选择在主构建之前和之后运行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上测试了这一点,并且在两者上都获得了相同的行为。据我所知,;
不会影响通话顺序。我在这里错过了什么吗?
答案 0 :(得分:6)
你有缓冲问题。
试试这个:
Sys.command "echo 'Hi!'";
Printf.printf "second\n%!";
Sys.command "echo 'Bye!'"
%!
说明符表示在此时刷新缓冲区。
因为它是一种混合范式语言(带有副作用),所以OCaml表达式以可预测的顺序执行。你可以依靠这个。如果事情似乎没有按顺序执行,那么还有其他事情要发生。
(作为旁注,请注意,函数参数的评估顺序不受约束。)