Неявно ленивый собирать / брать не считается «ленивым» объектом - PullRequest
7 голосов
/ 15 апреля 2019

В документации для упоминания о взятии / взятии

Привязка к скалярному или безцифловому контейнеру также приведет к лени.

Однако

my \result = gather { for 1..3 { take $_² } };
say result.is-lazy # OUTPUT: «False␤»  

То же самое происходит, если вы используете скаляр и привязку, используя := Есть ли способ создания неявно ленивых операторов сбора / получения?

Обновление : Это на самом делеленивый, только он не отвечает на ленивый метод ожидаемым образом:

my $result := gather { for 1..3 { say "Hey"; take $_² } };
say $result[0] # OUTPUT: «Hey␤1␤»

Итак, вопрос в том, «каковы условия, чтобы ленивый считал вещи действительно ленивыми?»

1 Ответ

9 голосов
/ 15 апреля 2019

Я думаю, что проблема в том, что вы на самом деле не можете сказать, что происходит внутри блока gather.Вот почему этот Seq объект говорит вам, что он не ленивый.

Возможно, это скорее вопрос документации: если is-lazy возвращает True, то вы можете быть уверенными , чтоSeq (ну, на самом деле его базовая Iterator) сама по себе не закончится.Если is-lazy возвращает False, это в основном означает, что мы не можем быть уверены.

Можно утверждать, что в этом случае is-lazy должен возвращать объект типа Bool, который также будет интерпретироваться какfalse (поскольку все объекты типа считаются False в логическом контексте).Но это, по крайней мере, дало бы какое-то указание на то, что оно действительно не определено / неразрешимо.

...