Michel J Lambert <[EMAIL PROTECTED]> writes:
>
> > Macros could add something to Perl, but I don't see why having a macro
> > return a string instead of looking and acting like a subroutine would be
> > a bad thing. In fact, as I pointed out before, you can do almost all of
> > the scoping stuff that you would want out of a macro in Perl with the
> > existing subroutine/code ref syntax and a special property.
>
> I disagree here. How would I define foreach as a macro (assuming the
> following, simplified syntax).
> foreach $each, @array, {
> print $each;
> };
>
> Since $each is being passed to the foreach macro, the macro needs to
> create a lexical scoping for $each, and place the third argument as a loop
> body, within the context of the scoping it just defined.
That suggested a similar example to me...
In Lisp (or, more likely, Scheme), you get constructs like:
(let ((a 'b) (c 'd) ... ) (...))
being defined as equivalent to:
((lambda (a c ...) (...)) 'b 'd ...)
and the macro system can convert the let into the evaluated lambda.
Suppose we wanted to have a Perl construct that was similar:
my $a = let ($b -> 5, $c -> $x) { $b + $c };
The most similar replacement for the let to the lisp case is:
my $a = &(sub { my ($b, $c) = @_; return $b, $c; })(5, $x);
With the macro system (using qs() for things to be evaluated at
compile time), I could see something like:
macro let (%&)
{ &(sub { my qs(keys @_[0]) = @_; return qs(@_[1]); })(qs(values @_[1]))};
I'm not sure that that would work perfectly offhand (I suspect some
syntax tweaking would be necessary) but it's the basic idea I think
you are going for.
--
Buddha Buck [EMAIL PROTECTED]
"I will not die an ironic death" -- Scott Ian, lead singer for
the metal band Anthrax, after bioterrorist attacks using anthrax.