Imposible poner un mapa en contexto de hundimiento

8

Estoy tratando de ver la forma de lanzar un mapa en contexto de sumidero. En este código

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

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

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

los for bucle efectivamente hunde todo lo creado, el mapno. ¿Alguna idea de por qué?

Esta prueba en asado: https://github.com/perl6/roast/blob/b9bfe1844db25f65a4aeb351a0107f83689cb5c2/S04-statements/sink.t#L27-L32 se supone que funciona como una prueba para eso. Y el mapa está efectivamente en un contexto de hundimiento, pero no veo cómo se "ejecuta como hundido". Simplemente se ejecuta.

jjmerelo
fuente

Respuestas:

6

En su ejemplo, mapdevuelve a Seqcon Sunkobjetos en él. Todo Seqestá hundido, lo que efectivamente llama Seq.iterator.sink-all, lo que no hunde todos sus elementos: simplemente tira del Seqvacío llamando pull-onehasta que IterationEndse devuelve.

Elizabeth Mattijsen
fuente
5

No explicaré mucho sobre la marcha, dejando la mayor parte hasta el final.

Estoy tratando de ver la forma de lanzar un mapa en contexto de sumidero.

Agregar --> Nilcomo valor de retorno del bloque hace eso:

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

El forbucle efectivamente hunde todo lo creado, el mapno.

Por defecto, los bloques se ejecutan con:

  • Todas las declaraciones excepto la última en contexto de sumidero.

  • La última declaración no en contexto de sumidero. (La última declaración es el valor de retorno del bloque, por lo que se presume que es inapropiado arrojarlo al fregadero).

Su código no alteró este valor predeterminado para su mapllamada, por lo que la última instrucción del bloque, su única instrucción, no estaba en contexto de sumidero. (Agregar --> Nila la firma del bloque vuelve a colocar la última declaración en el contexto del receptor).

Las excepciones a este esquema predeterminado implican algún tipo de palabra clave de declaración. fores uno de estos: pone su declaración, o la última declaración en su bloque, en contexto de sumidero. (Para deshacer eso, de modo que la última declaración no esté en contexto de hundimiento, puede escribir algo como $ = do for ...).

Se supone que esta prueba en asado funciona como una prueba para eso. Y mapestá efectivamente en un contexto de hundimiento, pero no veo cómo se "ejecuta como hundido". Simplemente se ejecuta.

Estoy confundido por el boleto correspondiente y la prueba. Entonces, lo siento, no puedo ayudar en eso.


Investigué durante horas preparando esta respuesta. Algunas de las piezas que encontré y en las que confié para seguir, junto con breves notas mías.

Muchos de los siguientes enlaces van a líneas particulares de registros de IRC. Mi intención para la mayoría de ellos es que leas un poco del diálogo que sigue a cada línea para maximizar lo que obtienes de ella (incluso si es confusión, porque creo que incluso eso podría ser útil, como explicaré a continuación).

Considere leer al menos los resúmenes a continuación y haga clic en algunos de los enlaces, y luego publique comentarios debajo de esta respuesta para provocar más discusión aquí para ver si podemos avanzar hacia la claridad.

raiph
fuente
Muchas gracias por la respuesta, pero en su ejemplo, cada elemento devuelto por el mapa se arroja en un contexto de sumidero, no el mapa en sí. Creo que la respuesta de @ elizabeth-mattijsen lo logra.
jjmerelo