Я не использовал его, но сообщение в группах Caml на прошлой неделе упоминает Талисман . Похоже, что вы после. Я не уверен в критериях хвостовой рекурсии; автор вышеупомянутого проекта не упоминает их, но упоминает возможности плагина.
В качестве альтернативы, компиляция с -dlinear
(для ocamlopt[.opt]
) создаст линеаризованный код, который упоминает, если функция является хвостовым вызовом. -annot
также производит информацию о хвостовом вызове, но я не могу найти ссылку, кроме changelog (он был добавлен в 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]
Я думаю, что опыт будет вашим лучшим выбором. Просмотрите некоторые популярные проекты (например, Battery ), чтобы почувствовать стиль и типичные условные обозначения. Я не думаю, что плагин поможет вам назвать ваши аккумуляторные переменные acc
или продолжения cont
.