2013-08-26 20 views
8

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) 
+0

Mono hangi platformda çalışıyorsunuz? (FreeBSD? OS X? Linux?) –

+0

Linux. Bu fark varsa 64G RAM ile 8 çekirdekli AMD makinesi. –

+0

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.) –

cevap

1

olarak bildiğim kadarıyla, --optimize=tailc desteklenen bir F # derleyici bayrak değil.

Mono'da tailcall-optimizasyon desteğini etkinleştirmenin/devre dışı bırakmanın bir yolu olduğunu sanmıyorum (komut satırından, neyse); kuyruk arama eniyilemelerini etkinleştirmek için F # derleyici bayrağı --tailcalls+, ancak varsayılan olarak Compiler Options (F#)'a göre budur.

ben vardır en iyi seçenek bu karar almak için düşünüyorum:

    (irc.gnome.org üzerine) #monodev IRC kanalında
  • File a bug report with Xamarin
  • Git ve orada geliştiriciler/destekçilerinden birinin olmadığını görmek size yardımcı olabilir.
+0

Tailc bir Mono "optimizasyon" seçeneğidir. F # çalıştırırken --tailcalls kullanıyorum. Mono'nun kuyruğa doğru ilerlememesi (ya da yakın zamana kadar) elde edilmemesinin iyi bilindiği için, bir hata raporunun karşı üretken olacağından şüpheleniyorum. Fakat eğer birileri mevcut desteğin ne zaman çalıştığını tam olarak bildiyse ve bunu yapmadığında, bu çok yardımcı olacaktır. –

+3

Eğer bir hata yapmazsanız, bunu düzeltmeyi bilen biri nasıl olurdu? – 7sharp9