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 表达式以可预测的顺序执行。你可以依靠这个。如果事情似乎没有按顺序执行,那么还有其他事情正在发生。
(作为旁注,请注意函数参数的求值顺序不受限制。)
是的,所以这是一个让我大吃一惊的奇怪问题。基本上,我正在开发一个构建系统,让您可以在主构建之前和之后选择 运行 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 表达式以可预测的顺序执行。你可以依靠这个。如果事情似乎没有按顺序执行,那么还有其他事情正在发生。
(作为旁注,请注意函数参数的求值顺序不受限制。)