No lo he usado pero message on the Caml Groups la semana pasada menciona Mascot. Parece ser lo que buscas. No estoy seguro acerca de los criterios de recursividad de cola; el autor del proyecto anterior no los menciona, pero menciona las capacidades de los complementos.
Como alternativa, compilar con -dlinear
(para) producirá un código lineal que menciona si la función es una llamada de cola. -annot
también produce información de llamada final, pero no puedo encontrar una referencia aparte del changelog (se agregó en 3.11.0). De qué manera marca las llamadas de cola, no hace lo contrario, etiqueta las llamadas sin cola (¿o tal vez hay una manera?). A continuación se muestra un ejemplo de la salida de una función llamada sum
,
let rec sum a = function
| x when x = 0 -> a
| x -> sum (a+1) (x-1)
produce (entre otras muchas actividades salida),
*** 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]
Creo que la experiencia va a ser la mejor opción sin embargo. Consulte algunos proyectos populares (Batteries, por ejemplo) para familiarizarse con el estilo y las convenciones típicas. No creo que un complemento lo ayude a llamar a sus variables de acumulador acc
o continuaciones cont
.