Mozilla Sweet.js: Extending JavaScript with Macros
infoq.com
infoq.com
For Perl5 you can use Devel::Declare (https://metacpan.org/module/Devel::Declare) or Devel::CallParser (https://metacpan.org/module/Devel::CallParser) to achieve macro like effects.
For eg. Here's the Sweet.js def add macro using Devel::Declare...
package MyDef;
use strict;
use warnings;
use base 'Devel::Declare::MethodInstaller::Simple';
sub import {
my $class = shift;
my $caller = caller;
my $arg = shift;
$class->install_methodhandler(
into => $caller,
name => 'def',
);
}
sub parse_proto {
my $ctx = shift;
my ($proto) = @_;
"my ($proto) = \@_;";
}
1;
Then... use 5.016;
use warnings;
use MyDef;
def add ($x, $y) { $x + $y }
say add(1, 2); # => 3
So when the compiler sees the def keyword then MyDef takes over and converts the line into... sub add { my ($x, $y) = @_; $x + $y }
... then passes everything back to the perl parser to continue compiling the rest of the code.For more examples of where macros can be useful see this previous HN post: http://news.ycombinator.com/item?id=3124920