Курс языка программирования 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. Префикс устанавливает флаг ленивости независимо от размера списка — он не обязан быть бесконечным, чтобы быть ленивым.

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

Принудительное немедленное вычисление   |   Подавление предупреждения