• Haskell Lua stg mstg Я понял как я ломаю стек лунного: при вычислении длины списка у меня накапливаются ленивые суммирования, которые как я не крути всё равно представляют цепочку не хвостовых вызовов. Когда этих отложенных суммирований набирается 50 — 100 тысяч, а потом внешнее резко форсируется происходит несколько десятков тысяч нерекурсивных вызовов функции рантайма EVAL (вычисляющей отложенное значение и раскручивающей продолжения) и стеку лунного становится плохо. Не знаю как это чинить. Была бы это сишка, можно было бы сделать переход в EVAL в виде jump'а…

Replies (2)

  • @ndtimofeev, Если мы говорим о классическом length (x:xs) = 1 + length xs, то да, накапливается.
    Но в практических реализациях оно выглядит как-то так
    length = go 0 where go !n (x:xs) = go (n+1) xs, и тут уже копиться нечему.
  • @rkit, Это я уже понял. Я несколько увлёкся «починкой» выходного кода, что попытался в нём решить проблемы кодв входного. Тем не менее, мне кажется что в теории можно сформировать выходной код так, чтобы разростание стека stg не приводило к разростанию стека lua.