Kullanılmadım ama geçen hafta message on the Caml GroupsMascot. Neyin peşinde olduğun gibi görünüyor. Kuyruk-yineleme kriterleri hakkında emin değilim; Yukarıdaki projenin yazarı bunlardan bahsetmiyor, ancak eklenti yeteneklerinden bahsediyor. Alternatif olarak, -dlinear
(ocamlopt[.opt]
için) ile derleme, işlev bir kuyruk çağrısı olduğunda söz eden doğrusal kod üretecektir. -annot
ayrıca kuyruk araması bilgileri de üretir, ancak changelog (3.11.0 sürümünde eklenmiştir) dışında bir başvuru bulamıyorum. Kuyruk çağrılarını ne şekilde yapar, sohbeti yapmaz, kuyruksuz çağrıları etiketler (veya belki bir yolu var mı?). Aşağıda
*** 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]
ben deneyim olsa en iyi bahis olacak düşünüyorum
let rec sum a = function
| x when x = 0 -> a
| x -> sum (a+1) (x-1)
(çok daha çıktı arasında) üretir,
sum
adlı bir işlev için çıkış örneğidir. Stil ve tipik kurallar için bir fikir edinmek için bazı popüler projelere göz atın (örneğin,
Batteries). Bir eklentinin,
acc
akümülatör değişkenlerinizi veya
cont
sürekliliklerini aramanıza yardım edeceğini sanmıyorum.