Невозможно поместить карту в контекст стока - PullRequest
8 голосов
/ 12 февраля 2020

Я пытаюсь увидеть способ бросить карту в контексте приемника. В этом коде

class Sunk {
    has $.titanic;
    method sink {
        say "Sinking $!titanic";
    }
}

Sunk.new( :titanic($_) ) for 1..3;

(1..3).map: { Sunk.new( :titanic($_) ) };

for l oop эффективно поглощает все созданное, а map - нет. Любая идея, почему?

Этот тест в жареном виде: https://github.com/perl6/roast/blob/b9bfe1844db25f65a4aeb351a0107f83689cb5c2/S04-statements/sink.t#L27 -L32 должен работать как тест для этого. И карта эффективно в контексте стока, но я не вижу, как она «работает как потопленная». Это просто запустить.

Ответы [ 2 ]

6 голосов
/ 12 февраля 2020

В вашем примере map возвращает Seq с Sunk объектами в нем. Весь Seq потоплен, что фактически вызывает Seq.iterator.sink-all, что не поглощает все его элементы: он просто вытягивает Seq пусто, вызывая pull-one, пока не будет возвращено IterationEnd.

5 голосов
/ 13 февраля 2020

Я не буду много объяснять, как я go, оставив основную часть этого до конца.

Я пытаюсь найти способ бросить карту в контексте стока.

Добавление --> Nil в качестве возвращаемого значения блока делает следующее:

(1..3).map: -> $_ --> Nil { Sunk.new( :titanic($_) ) }

for l oop эффективно поглощает все созданные, map нет.

По умолчанию блоки выполняются с:

  • Все операторы, кроме последнего в контексте приемника.

  • Последнее утверждение не в контексте приемника. (Последний оператор является возвращаемым значением блока, поэтому предполагается, что он не подходит для его сброса.)

Ваш код не изменил это значение по умолчанию для вашего вызова map, поэтому Последнее утверждение блока - его единственное утверждение - не было в контексте приемника. (Добавление --> Nil к подписи блока возвращает последний оператор в контекст приемника.)

Исключения из этой схемы по умолчанию включают в себя какое-то ключевое слово оператора. for является одним из них - он помещает свой оператор или последний оператор в своем блоке в контекст приемника. (Чтобы отменить это, чтобы последнее выражение было , а не в контексте приемника, вы можете написать что-то вроде $ = do for ....)

Этот тест в roast должен работать как тест для этого. И map эффективно в контексте стока, но я не вижу, как он «работает как потоп». Это просто запустить.

Я смущен соответствующим билетом и тестом. Так что, извините, я не могу помочь с этим.


Я часами изучал подготовку этого ответа. Далее следуют некоторые фрагменты, которые я нашел и на которые опирался, а также краткие заметки, сделанные мной.

Многие из следующих ссылок go ссылаются на определенные строки журналов IR C. Моим намерением для большинства из них является то, чтобы вы прочитали немного диалогов, которые следуют за каждой строкой, чтобы максимизировать то, что вы получаете от этого (даже если это путаница, потому что я думаю, что даже это может быть полезно, как я объясню далее).

Пожалуйста, рассмотрите хотя бы краткое изложение ниже и нажмите на некоторые ссылки, а затем опубликуйте комментарии под этим ответом, чтобы спровоцировать дальнейшее обсуждение здесь, чтобы посмотреть, сможем ли мы достичь ясности.

...