Ich habe es nicht verwendet, aber eine message on the Caml Groups letzte Woche erwähnt Mascot. Es sieht so aus, als ob Sie danach suchen. Ich bin mir nicht sicher über die Tail-Recursion-Kriterien; Der Autor des oben genannten Projekts erwähnt sie nicht, erwähnt aber Plugin-Fähigkeiten.
Alternativ kann das Kompilieren mit -dlinear
(für ocamlopt[.opt]
) linearisierten Code erzeugen, der angibt, ob die Funktion ein Tail-Call ist. -annot
produziert auch Tail-Call-Informationen, aber ich kann keine Referenz neben der changelog finden (es wurde in 3.11.0 hinzugefügt). Auf welche Art und Weise es Tail-Calls taggt, es nicht die Converse, Tag Non-Tail-Calls (oder vielleicht gibt es einen Weg?). Unten ist ein Beispiel für die Ausgabe für eine sum
,
let rec sum a = function
| x when x = 0 -> a
| x -> sum (a+1) (x-1)
erzeugen aufgerufene Funktion (viel mehr Leistung unter),
*** 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]
Ich denke, Erfahrung, obwohl die beste Wahl sein wird. Sehen Sie sich einige beliebte Projekte an (zB Batteries), um ein Gefühl für Stil und typische Konventionen zu bekommen. Ich glaube nicht, dass ein Plugin Ihnen helfen wird, Ihre Akkumulatorvariablen acc
oder Fortsetzungen cont
aufzurufen.