是的,所以这是一个奇怪的问题,让我感到惊讶.基本上,我正在构建一个构建系统,它允许您在主构建之前和之后运行shell命令.要执行这些命令我只是使用Sys.command
.问题是每当我使用该函数时,它都会改变调用函数的顺序.例如:
Sys.command "echo 'Hi!'";
Printf.printf "second\n";
Sys.command "echo 'Bye!'"
Run Code Online (Sandbox Code Playgroud)
输出
Hi!
Bye!
second
Run Code Online (Sandbox Code Playgroud)
来自REPL和已编译的可执行文件.但是,如果我使用任何其他功能,它似乎工作正常.有趣的是,如果我定义一个函数来调用Sys.command
它仍然以错误的顺序执行.我已经在GNU/Linux上运行的4.02.1和Cygwin中的4.01.0上测试了这一点,并且在两者上都获得了相同的行为.据我所知,;
这不会影响通话顺序.我在这里错过了什么吗?
你有一个缓冲问题.
试试这个:
Sys.command "echo 'Hi!'";
Printf.printf "second\n%!";
Sys.command "echo 'Bye!'"
Run Code Online (Sandbox Code Playgroud)
该%!
说明符说,在这一点上刷新缓冲区.
因为它是一种混合范式语言(具有副作用),所以OCaml表达式以可预测的顺序执行.你可以依靠这个.如果事情似乎没有按顺序执行,那么还会有其他事情发生.
(作为附注,请注意,函数参数的评估顺序不受约束.)