Jak Håkon Hægland już wspomniano, nie jest to coś, co masz robić:
Skrzyżowania mają być wykorzystane jako dopasowujących w kontekście logicznym; introspekcja złączy nie jest obsługiwana. Jeśli czujesz potrzebę introspekcji skrzyżowania, użyj zamiast tego zestawu lub podobnego typu.
- docs.perl6.org/type/Junction
Jednak jest to możliwe.
Po pierwsze, można użyć authothreading (czyli automatyczna ocena każdej gałęzi skrzyżowania gdy przekazany do funkcji, która oczekuje argumentu typu Any
):
sub unjunc(Junction $j) {
gather -> Any $_ { .take }.($j);
}
drugie, może kłuć w jelitach i ręcznie wyodrębnić wartości:
sub unjunc(Junction $j) {
multi extract(Any $_) { .take }
multi extract(Junction $_) {
use nqp;
my $list := nqp::getattr($_, Junction, '$!storage');
my int $elems = nqp::elems($list);
loop (my int $i = 0; $i < $elems; $i = $i + 1) {
extract nqp::atpos($list, $i);
}
}
gather extract $j;
}
Jeśli węzeł jest nierekursywnych (czyli nie zawiera innych węzłów, które chcesz spłaszczyć), to ostatnie podejście można uprościć:
my $j := 1|2|3;
say nqp::p6bindattrinvres(nqp::create(List), List, '$!reified',
nqp::getattr($j, Junction, '$!storage'));
Zgodnie z [dokumentacją] (https://docs.perl6.org/type/Junction): * "Połączenia są przeznaczone do użycia jako korektory w kontekście boolowskim, introspekcja połączeń nie jest obsługiwana. zachęcamy do introspekcji skrzyżowania, zamiast tego użyj zestawu lub pokrewnego typu. "* –