[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