The original motive here was efficiency. That's taken more-than-usually seriously in this case, because array descriptors are one of the few upper-layer features which are mostly about efficiency -- everything they do could be done as well or better in Perl code, but at a substantial penalty in efficiency.

In XS, a reference is a pointer copy (one machine instruction) and incrementing the SV's reference count. A scalar means a copy of another scalar, which means creating a new SV, a much more costly operation. Depending on context, creating an SV is not a huge overhead -- a Perl script is creating SV's all the time. But here the context is that avoiding this kind of overhead is *exactly* why array descriptors were created.

In addition, with the release not long ago of the CPAN indexed version, there is now the issue of backward compatibility.

This makes these scalars, for most purposes, read-only. (Though you could do your own copy-on-write.) A workaround might be to keep the scalars in their original state, and add a new field to the array. In this case it would mean you have "cooked" and "raw" versions of the name. This also might have other advantages: It's a more functional (fewer side effects) style of coding, and the "raw" version may even come in handy later.

Hope this helps, jeffrey

On 03/01/2014 04:41 PM, Ruslan Shvedov wrote:
As in script <https://gist.github.com/rns/9299823#file-refs-in-ast-t>, output <https://gist.github.com/rns/9299823#file-refs-rather-than-scalars-in-ast>.

A symbol, e.g. 'bracketed' in one ast node is followed by ${\$VAR1->[0]} in its place in all ast nodes downwards.

My use case where I'd appreciated scalars rather than refs in /ast_symbol_name_to_id/ sub below in my transpiler <https://github.com/rns/MarpaX-Regex/blob/master/t/translation.t>, this assignment

    $ast->[0] = "$name/$symbol"


changes all downward nodes and the below subs stops working.

Is it possible that symbol and name descriptors always produce scalars in AST's?

#
# convert nodes' symbol, name tuples to id's
#
sub ast_symbol_name_to_id {
    my ($ast) = @_;
    if (ref $ast){
        my ($name, $symbol, @nodes) = @$ast;
        warn "ast_symbol_name_to_id:", "'$name', '$symbol'";
        if ($name eq $symbol){
            $ast->[0] = $name;
        }
        else{
            $ast->[0] = "$name/$symbol";
        }
        splice @$ast, 1, 1;
        map { ast_symbol_name_to_id ( $_ ) } @nodes;
    }
}



--
You received this message because you are subscribed to the Google Groups "marpa parser" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

--
You received this message because you are subscribed to the Google Groups "marpa 
parser" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to