OCaml编译器是否会利用let...and绑定的未指定求值顺序?
OCaml中let...and绑定的求值顺序问题
根据OCaml手册,let pattern_1 = expr_1 and … and pattern_n = expr_n in expr结构里,expr_1到expr_n的求值顺序是未指定的。针对你提出的问题,具体说明如下:
- 目前主流OCaml编译器(ocamlc、ocamlopt)的实际实现中,
let...and绑定的表达式求值普遍采用左到右的顺序,和你测试得到的结果一致。 - 但这种左到右的行为属于编译器实现细节,并非语言规范强制要求。这意味着未来版本的编译器,或是其他OCaml第三方实现,完全可能根据优化需求调整求值顺序,只要符合手册中“未指定顺序”的定义即可。
- 你提到的函数参数求值顺序在ocamlopt与ocamlc+ocamlrun间存在差异的情况,目前并未出现在
let...and绑定中,但这不能排除未来出现的可能性——毕竟语言规范没有固定该顺序,编译器拥有调整的权限。
你的测试代码如下:
let p = Printf.printf "%d%!" let rec spin = function | 0 -> () | n -> spin (n - 1) let () = let x0 = spin 99999999 and x1 = p 2 and x2 = p 3 in let _ = x0, x1, x2 in ()
内容的提问来源于stack exchange,提问作者Max Heiber
相关产品推荐
相关产品推荐

