Курс по Raku / Напреднали / Управление на потока / Префикси на инструкции 🆕 / Exercises / Принудете нетърпеливо изчисление

Решение: Принудете нетърпеливо изчисление

Ето едно възможно решение на задачата.

Код

say (1 .. Inf).is-lazy;
say (eager 1..3).is-lazy;
say (lazy 1..3).is-lazy;

🦋 Изходният код на тази програма можете да намерите във файла force-eager.raku.

Изход

True
False
True

Коментари

  1. Диапазон до Inf не може да бъде изчислен наведнъж, затова е мързелив: .is-lazy връща True.

  2. Префиксът eager принуждава списъка да бъде произведен веднага, така че резултатът вече не е мързелив — .is-lazy връща False. Това е прекият аналог на маркирането на списък с lazy.

  3. Не прилагайте eager към неограничен диапазон: eager 1 .. Inf се опитва да изчисли всеки елемент наведнъж, така че програмата просто увисва, консумирайки все повече памет, докато не бъде убита. eager е безопасен само за списъци, за които знаете, че са крайни.

  4. Обратното също работи: lazy 1..3 маркира дори кратък, краен диапазон като мързелив, така че .is-lazy връща True. Префиксът задава флага за мързеливост независимо от това колко малък е списъкът — не е нужно да е безкраен, за да бъде мързелив.

Навигация в курса

Принудете нетърпеливо изчисление   |   Заглушете предупреждение