我怎么知道OCaml是否将特定函数识别为尾递归?特别地,我想找出OCaml编译器是否识别短路运算符和尾递归。
感谢Jeffrey在下面的答案,我使用了这个简单函数进行测试
let rec check_all l =
match l with
| [] -> true
| hd :: tl ->
hd && check_all tl
实际上,它确实进行了优化,结果为:
camlTest__check_all_1008:
.cfi_startproc
.L102:
cmpl $1, %eax
je .L100
movl (%eax), %ebx
cmpl $1, %ebx
je .L101
movl 4(%eax), %eax
jmp .L102
.align 16
.L101:
movl $1, %eax
ret
-annot
选项输出中也提供了更多信息。一种展示类型注释的工具可以用来在文件中添加尾调用信息。ocamlopt[.opt]
的-dlinear
选项也会在修改后的源代码输出中包含带有尾调用的注释。 - nlucaroni