"No se puede asignar a un valor inmutable" cuando se intenta asignar a una cadena + rol

Empezando conel ejemplo en la página del documento Iterable

role DNA does Iterable {
  method iterator(){ self.comb.iterator }
};

my @a does DNA = 'GAATCC';
.say for @a; # OUTPUT: «G␤A␤A␤T␤C␤C␤» 

Me pareció extraño que se declare usando la@, así que lo cambié anatura forma de declarar cadenas,$:

my $a does DNA = 'GAATCC';

Pero eso falla con un desconcertante "No se puede asignar a un valor inmutable". No es necesario asignar en el acto, por lo que podemos hacer:

my $a = 'GAATCC';
$a does DNA;
.say for $a;

Lo que deja la mezcla para más tarde. Pero eso solo imprime la cadena, sin prestar atención a laIterable mixin. Llamémoslo explícitamente:

.say for $a.iterator;

it hace lo mismo que antes, solo imprime el valor de$a.iterator, sin llamar realmente a la función:

<anon|69>.new

Esto se parece ala misma cosa está sucediendo en esta otra pregunta. La pregunta básica es que no entiendo qué papel hace Iterable realmente y quéfor realmente lo hace y cuando está llamando aiterator en algún objeto. ¿Alguna idea

Respuestas a la pregunta(2)

Su respuesta a la pregunta