gpt4 book ai didi

compiler-construction - 验证OCaml函数是否为尾递归

转载 作者:行者123 更新时间:2023-12-04 09:35:30 25 4
gpt4 key购买 nike

如何判断OCaml是否将特定功能识别为尾递归?特别是,我想确定OCaml编译器是否可以识别Short-circuited operators and tail recursion

感谢下面的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

最佳答案

从OCaml 4.03开始,尽管Changes文件中有错字,您仍可以在函数应用程序中使用@tailcall,如果不是这样,编译器将发出警告。

(f [@tailcall]) x y warns if f x y is not a tail-call



例子:
$ cat tailrec.ml
let rec f a x = if x <= 1 then a else (f [@tailcall]) (a * x) (x - 1)

let rec g x = if x <= 1 then 1 else x * (g [@tailcall]) (x - 1)

$ ocaml tailrec.ml

File "tailrec.ml", line 3, characters 40-63:
Warning 51: expected tailcall

关于compiler-construction - 验证OCaml函数是否为尾递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23186717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com