F # kodu altında .net altında çalışan ancak Mono'nun altındaki yığını taşan bir kod var. İlgili bir konu şudur ki, söz konusu yığın boşluğu bittiğinden bu kadar uzun bir süre önce çalışmaktadır (System.Threading.Thread (ts, 1000000000) ile başlatılmıştır). Anlayabildiğim kadarıyla, öleceği kat kuyruk özyinelemeli ve kuyruk izlemesi, kuyruk optimizasyonu yapılmıyor gibi görünüyor. 3.2.1'i --optimize = tailc ile çalıştırıyorum.Mono'daki Tailcalllar
Herhangi biri, ne tür kuyruk çağrılarının çağrı yığınını kaldırdığını ve hangilerinin olmadığını bilmez mi? Veya alternatif olarak daha fazla yığın nasıl tahsis edilir? Çok teşekkürler.
Ben Tailcall elimination in Mono
DÜZENLEME farkındayım: Açıklamalarda istendiği gibi burada kod bir taslaktır. Büyük bir veri yapısı üzerinde bir katın bir parçası, ancak başarısız stacktrace üzerinde sadece mapk ve myfold var.
let rec myfold f x k =
let rec mapk xs k =
match xs with
[] -> k []
| x::xs -> mapk xs (fun xs' -> myfold f x (fun x' -> (x' :: xs') |> k))
...
mapk (...) (... >> k)
Mono hangi platformda çalışıyorsunuz? (FreeBSD? OS X? Linux?) –
Linux. Bu fark varsa 64G RAM ile 8 çekirdekli AMD makinesi. –
Ne tür bir kuyruk özyeyici işlevi var? Kendini çağırır mı, yoksa başka bir işlev mi çağırır? (ya da süreklilikleri kullanıyor mu?) (Sadece neyin yanlış gittiğini anlamaya çalışıyorum - çünkü bazı kuyruk aramaları aslında F # derleyicisi tarafından en iyi duruma getirilmiştir.) –