История изменений
Исправление quasimoto, (текущая версия) :
см. чуть выше
А как использовать? Если так:
void region()
{
auto xs = dan_then_dog()();
for (int i = 0; i < 1000000; ++i, xs = xs.tail())
std::cout << xs.head << std::endl;
}
int main()
{
region();
for (int i = 0; i < 1000000; ++i)
std::cout << "..." << std::endl;
sleep(10);
}
то поведение как и у меня — линейно растёт память сотнями мегабайт, после выхода из region она не освобождается и висит до выхода из main.
Такой энергичный код
object Test {
// Неохота писать нормальный тип, пусть будет Any.
def f(a: Int, b: Int): (Int, Any) = (a, (_: Unit) => f(b, a))
def test {
var xs = f(1, 2)
for (_ <- 1 to 10000000) {
println(xs._1)
xs = xs._2.asInstanceOf[Unit => (Int, Any)]()
}
}
}
вообще никак на кучу JVM не влияет.
Такой:
d :: [Int]
d = 1 : 2 : d
main = go 10000000 d where
go 0 _ = return ()
go n (x:xs) = print x >> go (n - 1) xs
работает в постоянных 2MB RSS (хотя это уже чит, так как тут настоящий ленивый конвейер и лямбды не у дел).
Исходная версия quasimoto, :
см. чуть выше
А как использовать? Если так:
void region()
{
auto xs = dan_then_dog()();
for (int i = 0; i < 1000000; ++i, xs = xs.tail())
std::cout << xs.head << std::endl;
}
int main()
{
region();
for (int i = 0; i < 1000000; ++i)
std::cout << "..." << std::endl;
sleep(10);
}
то поведение как и у меня — линейно растёт память сотнями мегабайт, после выхода из region она не освобождается и висит до выхода из main.
Такой энергичный код
object Test {
// Неохота писать нормальный тип, пусть будет Any.
def f(a: Int, b: Int): (Int, Any) = (a, (_: Unit) => f(b, a))
def test {
var xs = f(1, 2)
for (_ <- 1 to 10000000) {
println(xs._1)
xs = xs._2.asInstanceOf[Unit => (Int, Any)]()
}
}
}
вообще никак на кучу JVM не влияет.
Такой:
{-# LANGUAGE BangPatterns #-}
d :: [Int]
d = 1 : 2 : d
main = go 10000000 d where
go 0 _ = return ()
go !n (x:xs) = print x >> go (n - 1) xs
работает в постоянных 2MB RSS (хотя это уже чит, так как тут настоящий ленивый конвейер и лямбды не у дел).