Impossível colocar um mapa no contexto do coletor

8

Estou tentando ver a maneira de jogar um mapa no contexto do coletor. Neste código

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

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

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

O forloop efetivamente afunda todo o criado, o mapnão. Alguma idéia do porquê?

Este teste no roast: https://github.com/perl6/roast/blob/b9bfe1844db25f65a4aeb351a0107f83689cb5c2/S04-statements/sink.t#L27-L32 deve funcionar como um teste para isso. E o mapa está efetivamente em um contexto de coletor, mas não vejo como ele é "executado como afundado". É simplesmente correr.

jjmerelo
fonte

Respostas:

6

No seu exemplo, o mapretorna a Seqcom Sunkobjetos. O todo Seqé afundado, o que efetivamente chama Seq.iterator.sink-all, o que não afunda todos os seus elementos: apenas puxa o Seqvazio chamando pull-oneaté que IterationEndseja retornado.

Elizabeth Mattijsen
fonte
5

Não vou explicar muito, deixando a maior parte até o fim.

Estou tentando ver a maneira de jogar um mapa no contexto do coletor.

Adicionar --> Nilcomo valor de retorno do bloco faz isso:

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

O forloop efetivamente afunda todo o criado, o mapnão.

Por padrão, os blocos são executados com:

  • Todas as declarações, exceto a última no contexto do coletor.

  • A última declaração não está no contexto do coletor. (A última instrução é o valor de retorno do bloco, portanto, presume-se inapropriado jogá-lo na pia.)

Seu código não alterou esse padrão para sua mapchamada, portanto, a última declaração do bloco - a única declaração - não estava no contexto do coletor. (Adicionar --> Nilà assinatura do bloco coloca a última instrução de volta no contexto do coletor.)

Exceções a esse esquema padrão envolvem algum tipo de palavra-chave de instrução. foré um desses - coloca sua declaração, ou a última declaração em seu bloco, no contexto do coletor. (Para desfazer isso, para que a última declaração não esteja no contexto do coletor, você pode escrever algo parecido $ = do for ....)

Este teste no assado deve funcionar como um teste para isso. E mapestá efetivamente em um contexto de afundamento, mas não vejo como é "executado como afundado". É simplesmente correr.

Estou confuso com o ticket correspondente e o teste. Então, desculpe, eu não posso ajudar nisso.


Eu fiz horas de pesquisa na preparação desta resposta. Seguem-se algumas das peças que encontrei e nas quais confiei, além de breves anotações minhas.

Muitos dos links a seguir vão para linhas específicas de logs do IRC. Minha intenção para a maioria delas é que você leia um pouco do diálogo que segue cada linha para maximizar o que obtém (mesmo que seja confusão, porque acho que isso pode ser útil, como explicarei a seguir).

Por favor, considere ler pelo menos os resumos abaixo e clicar em alguns dos links e, em seguida, poste comentários nesta resposta para provocar uma discussão mais aprofundada aqui para ver se podemos avançar em direção à clareza.

raiph
fonte
Muito obrigado pela resposta, mas no seu exemplo, todos os elementos retornados pelo mapa são lançados em um contexto de coletor, não no próprio mapa. Eu acho que a resposta de @ elizabeth-mattijsen realmente diz.
jjmerelo