[bcn-pm] el misteri del [<]
Xavier Noria
fxn a hashref.com
div jul 30 16:33:17 PDT 2010
Be em penso que ho tenim.
La reduccio que [...] fa per defecte te en compte metadata de
l'operador, i en el cas de < se sap que es chain-associative que en
diuen a l'S03. Us copio abaix el codi de Rakudo que ho fa. No entenc
ni papa d'aquest codi, pero m'han dit a #perl6 que la linea amb
'chaining' es el bit rellevant.
Per altra banda, hom es pot definir operadors de reduccio a ma. En
aquest cas implementes una subrutina (tecnicament no se si es una
subrutina, pero per entendre'ns) que rep una llista de coses i
retornes el que vols. Una reduccio implementada aixi pot fer el que
vulgui.
Salut!
-- fxn
method prefix_circumfix_meta_operator:sym<reduce>($/) {
my $opsub := '&prefix:<' ~ ~$/ ~ '>';
unless %*METAOPGEN{$opsub} {
my $base_op := '&infix:<' ~ $<op><OPER>.Str ~ '>';
$*UNITPAST.loadinit.push(PAST::Op.new(
:pasttype('bind'),
PAST::Var.new( :name($opsub), :scope('package') ),
PAST::Op.new(
:pasttype('callmethod'), :name('assuming'),
PAST::Op.new( :pirop('find_sub_not_null__Ps'), '&reducewith' ),
PAST::Op.new( :pirop('find_sub_not_null__Ps'), $base_op ),
PAST::Val.new( :named('triangle'), :value($<triangle>
?? 1 !! 0) ),
PAST::Val.new( :named('chaining'),
:value($<op><OPER><O><prec> eq 'm=') ),
PAST::Val.new( :named('right-assoc'),
:value($<op><OPER><O><assoc> eq 'right') )
)
));
%*METAOPGEN{$opsub} := 1;
}
make PAST::Op.new( :name($opsub), :pasttype('call') );
}
Més informació sobre la llista de correu Barcelona-pm