http://qs321.pair.com?node_id=617884


in reply to Re: [Perl 6] Any provision for a "dereferencing object"?
in thread [Perl 6] Any provision for a "dereferencing object"?

If you reverse their order, it's simply a closure:

$dereferencer = { $^moose.<foo>[1]<bar><baz>[3] }; $dereferencer($datastructure);

Yep this is very akin to what Joost suggested for Perl 5 (and was also mentioned in the original thread), except that it's more 6ish. I was thinking... is in general the semantics of $datastructure.$dereferencer definite? Is it valid syntax anyway? If not, could a C<.> infix multi, or even a macro, be specified to "amount to" the function call specified above?

Replies are listed 'Best First'.
Re^3: [Perl 6] Any provision for a "dereferencing object"?
by vrk (Chaplain) on May 29, 2007 at 11:00 UTC
    multi sub infix:<at> ($dsc, Code $deref) { $deref($dsc); } my %data = ( foo => [ { quux => 3 }, { bar => { baz => [ 1, 2, 3, 4 ] +}, }, ], ); my $dereferencer = { .<foo>[1]<bar><baz>[3] }; say %data at $dereferencer;

    Works in Pugs. Since there doesn't seem to be any good documentation about macros yet, I don't know how to beautify the dereferencer construction syntax, but it ought to be trivial to make a macro that translates deref <foo><bar><baz>[1] to { .<foo><bar><baz>[1] }.

    UPDATE: Fixed some blaring typos in the code. Thanks for noting it, blazar. (For some reason, you can't define a Hash in Pugs with

    my Hash %foo = ( # something );
    At least I get a syntax error with Pugs 6.2.13.)

    --
    print "Just Another Perl Adept\n";

      $dereferencer = { .<foo>[1]<bar><baz>[3] };

      I knew that "unary" dot acts implicitly on $_, but appearently your code implies that in code written as a bare block $_ is an alias to the first positional argument, and that I didn't know. Actually, without knowing, I would have written the above amongst other possibilities, like:

      $dereferencer = -> $d { $d.<foo>[1]<bar><baz>[3] };
Re^3: [Perl 6] Any provision for a "dereferencing object"?
by gaal (Parson) on May 29, 2007 at 12:03 UTC
    Well, like I said in the update: for $datastructure to respond to the $dereferencer method, you need it to do a certain Role. This can be achieved on the fly.