Я не буду много объяснять, как я go, оставив основную часть этого до конца.
Я пытаюсь найти способ бросить карту в контексте стока.
Добавление --> Nil
в качестве возвращаемого значения блока делает следующее:
(1..3).map: -> $_ --> Nil { Sunk.new( :titanic($_) ) }
for
l oop эффективно поглощает все созданные, map
нет.
По умолчанию блоки выполняются с:
Все операторы, кроме последнего в контексте приемника.
Последнее утверждение не в контексте приемника. (Последний оператор является возвращаемым значением блока, поэтому предполагается, что он не подходит для его сброса.)
Ваш код не изменил это значение по умолчанию для вашего вызова map
, поэтому Последнее утверждение блока - его единственное утверждение - не было в контексте приемника. (Добавление --> Nil
к подписи блока возвращает последний оператор в контекст приемника.)
Исключения из этой схемы по умолчанию включают в себя какое-то ключевое слово оператора. for
является одним из них - он помещает свой оператор или последний оператор в своем блоке в контекст приемника. (Чтобы отменить это, чтобы последнее выражение было , а не в контексте приемника, вы можете написать что-то вроде $ = do for ...
.)
Этот тест в roast должен работать как тест для этого. И map
эффективно в контексте стока, но я не вижу, как он «работает как потоп». Это просто запустить.
Я смущен соответствующим билетом и тестом. Так что, извините, я не могу помочь с этим.
Я часами изучал подготовку этого ответа. Далее следуют некоторые фрагменты, которые я нашел и на которые опирался, а также краткие заметки, сделанные мной.
Многие из следующих ссылок go ссылаются на определенные строки журналов IR C. Моим намерением для большинства из них является то, чтобы вы прочитали немного диалогов, которые следуют за каждой строкой, чтобы максимизировать то, что вы получаете от этого (даже если это путаница, потому что я думаю, что даже это может быть полезно, как я объясню далее).
Пожалуйста, рассмотрите хотя бы краткое изложение ниже и нажмите на некоторые ссылки, а затем опубликуйте комментарии под этим ответом, чтобы спровоцировать дальнейшее обсуждение здесь, чтобы посмотреть, сможем ли мы достичь ясности.
Ларри начинает реализовывать обработку приемников в STD (2010) . Включено главным образом для установления sh точки, с которой он начал вводить концепцию приемника для raku в кодовую форму (в анализаторе STD).
Патрик просит прояснить пример sub foo() { for @list { .say } }; foo(); 1
(2010) . Сосредоточьтесь на диалоге между Патриком и Ларри (TimToady) о том, что хотел Ларри, и игнорируйте побочные эффекты.
TimToady: «контекст приемника очень важен для выяснения удивительных сообщений об ошибках» (2012) . (Я считаю, что функция раковины в raku является проблемой разработчиков экстремальных мучений; см. Ссылки для отслеживания проблем ниже.)
jnthn: "Обратите внимание, что нетерпеливый контекст и контекст приемника различны. Контекст приемника должен сделать так, чтобы l oop (или карта) не строили список результатов "(2012) Это еще одна часть, чтобы утопить контекст. Это не просто удивительные сообщения об ошибках; это также касается производительности.
TimToady: "в любом случае, -> Nil выглядит довольно хорошей документацией процедуры, выполненной только для ее побочных эффектов" (2012)
TimToady: «мы могли бы go, чтобы иметь отдельные объявления для« процедур », но просто наличие возвращаемого типа приемника уже, кажется, говорит об этом» ( он имел в виду --> Nil
) (2012)
jnthn спрашивает: "TimToady: есть какие-то чувства к https://rt.perl.org/Ticket/Display.html?id=126005? По сути, такие вещи, как циклы, опускаются до своего последнего утверждения, таким образом, блок l oop оценивается как ноль, так что фазер UNDO срабатывает. " (2015) (Больше мучений для разработчиков ...)
9 открытых вопросов в rakudo / rakudo, соответствующих запросу "последнее утверждение"
Несколько открытых вопросов в rakudo / rakudo, соответствующих запросу "zoffix sink" ; особенно обратите внимание на Fl aws в подразумеваемой утечке / &unwanted
помощник # 157 билет.