On Tue, 2002-03-26 at 16:26, Michel J Lambert wrote:
> An example of where variable capture is needed is:
> macro println ($a) {
> return <<"EOF";
> print $a;
> print "\n";
> EOF
> }
> for my $b (1..100) {
> println $b;
> }
Ok, I don't get it. I'm willing to concede that I'm dense, but I need to
understand how.
This looks to me like:
sub println ($a) {
print $a, "\n";
}
for my $b (1..100) {
println $b;
}
And, if we inline the sub, the only difference will be...?
Your example seems to involve no variable capture at all, in fact, just
passing parameters to a macro. See below....
> Personally, I'm at a loss for how macros will fit seamlessly in Perl 6.
> The examples above return a string, instead of real code (to make it
> easier to see how the interpolation works.) The code passes in a block of
> code, which magically gets interpolated back into a string as its original
> code form.
I *can* see some advantage in:
macro mygrep ($code is macroblock, *@list) {
my @newlist = ();
for @list {
push @newlist, $_ if $code.();
}
return @newlist;
}
@x = mygrep {/\S/} $fh.getlines();
where no code reference is ever created. It could be abused mercilessly,
but I can see the massive savings in performance that we would reap,
especially when translating/compiling this code for native or JIT
execution. This is because we don't have to fire a function call each
time we execute the block.
But, perhaps this is too syntax-heavy. Maybe something simpler:
sub mygrep ($code is inline, *@list) {
my @newlist = ();
for @list {
push @newlist, $_ if $code.();
}
return @newlist;
}
@x = mygrep {/\S/} $fh.getlines();
Now you put it in the compiler's hands to determine if a code reference
should be generated or not. Access to $_ is the only thing that is in
question here, and I don't have a good answer off the top of my head.
It would be very interesting to see how
sub mymap ($code is inline, *@list) {
my @newlist = ();
for @list {
push @newlist, $code.();
}
return @newlist;
}
@x = mymap {mygrep {$_} split //, $_} $fh.getlines();
would behave. Possibly quite efficient.
> Other things which the above 'forintlist' example used was the ability to
> send an arbitrary structure to the macro, and have it be matched against
> the parameter list for the macro. This allows one more flexibility in
> passing parameters to a macro, as they don't need to be a straight out
> list/array, but can be more complicatged structures, which are
> automagically matched. If this were in perl 6, regular array/list argument
> passing could be a simple case of a more complex argument/parameter
> passing structure.
I think your ideas here are good. If a general mechanism could be found
for the syntax and deemed valuable enough to add, I'd be all for it.
However, is it really macro-specific or should it be part of the
function call syntax in general?