是否存在分析 OCaml 程序并建议对样式和代码进行一些改进的工具?在 perl 的世界中,仍然存在Perl::Critic以避免不良风格。
我需要的是一些工具,它们不仅可以提示样式,还可以使事情变得更简洁,并避免在 OCaml 程序中不是尾递归的构造。
有什么提示吗?
是否存在分析 OCaml 程序并建议对样式和代码进行一些改进的工具?在 perl 的世界中,仍然存在Perl::Critic以避免不良风格。
我需要的是一些工具,它们不仅可以提示样式,还可以使事情变得更简洁,并避免在 OCaml 程序中不是尾递归的构造。
有什么提示吗?
我没有使用它,但上周Caml Groups 上的一条消息提到了Mascot。它看起来就是你所追求的。我不确定尾递归标准;上述项目的作者没有提到它们,但确实提到了插件功能。
或者,使用-dlinear
(for ocamlopt[.opt]
) 编译将生成线性化代码,说明函数是否为尾调用。也产生尾调用信息,但除了更改日志-annot
之外我找不到参考(它是在 3.11.0 中添加的)。它以什么方式标记尾调用,它不做相反的标记非尾调用(或者也许有一种方法?)。下面是一个名为 的函数的输出示例,sum
let rec sum a = function
| x when x = 0 -> a
| x -> sum (a+1) (x-1)
产生(在更多的输出中),
*** Linearized code
camlTail__sum_58:
if x/30[%rbx] !=s 1 goto L100
return R/0[%rax]
L100:
I/31[%rbx] := I/31[%rbx] + -2
I/32[%rax] := I/32[%rax] + 2
tailcall "camlTail__sum_58" R/0[%rax] R/1[%rbx]
我认为经验将是你最好的选择。浏览一些流行的项目(例如电池),以了解风格和典型惯例。我认为插件不会帮助您调用累加器变量acc
或延续cont
。