En el siguiente ejemplo, trato de crear una captura dinámicamente "convirtiendo" una matriz (@a) en una captura.
Considera el código:
sub f (|c){
say '';
say ' List : ' ~ do {c.list.gist if c.list.elems > 0};
say ' Hash : ' ~ do {c.hash.gist if c.hash.elems > 0};
say '';
}
my $c1 = \(1,(2,3),4,5, :t1('test1'), 6,7, :t2('test2'), 8,9);
my @a = 1,(2,3),4,5, :t1('test1'), 6,7, :t2('test2'), 8,9;
my $c2 = \(|@a);
f(|$c1);
f(|@a);
f(|$c2);
El resultado es:
List : (1 (2 3) 4 5 6 7 8 9)
Hash : Map.new((t1 => test1, t2 => test2))
List : (1 (2 3) 4 5 t1 => test1 6 7 t2 => test2 8 9)
Hash :
List : (1 (2 3) 4 5 t1 => test1 6 7 t2 => test2 8 9)
Hash :
La primera ejecución (con Capture $ c1) se ejecuta como debería, produciendo el comportamiento deseado. El segundo y tercer intento, para crear una Captura dinámicamente, están fallando (probablemente porque el argumento de la subrutina f en esos casos NO es la Captura deseada). Observo que los pares incorporados en la matriz @a, se consideran miembros de una lista y NO parámetros nombrados como yo quería que fueran.
Sé que debe haber, más o menos, un "aplanamiento" de los pares en la matriz, antes de pasar a la subrutina f, ¡pero NO puedo encontrar la manera de hacerlo!
¿Alguien puede darme una pista?

Foo(Any)como tipo, probablemente pueda usarloFoo(). No me puedo imaginar un momento en el que tomaría unaAnypero no un noAnyMu