あなたがLispを無視することができない理由より、Perlでは構文解析が必要とのことだったので、素のPerlで書けるか試してみる。
use 5.016;
use warnings;
package _Alias;
sub TIESCALAR { bless \(my $dmy = \($_[1])), $_[0] }
sub FETCH { ${${$_[0]}} }
sub STORE { ${${$_[0]}} = $_[1] }
package main;
sub args {
my @list = map{ \$_ } @_;
return sub {
foreach(@list){
tie ${$_}, '_Alias' => shift();
}
};
}
sub with {
my ($methods, $hash, $f) = @_;
sub{
foreach(@{$methods}){
tie $_[@_], '_Alias' => $hash->{$_};
}
goto $f;
}->();
}
my $me = { name => "foobar", age => 26 };
with([qw(age)] => $me, sub{
args(my $age)->(@_);
$age++;
});
with([qw(name age)] => $me, sub{
args(my ($name, $age))->(@_);
printf("I'm %s. %d years old.\n", $name, $age);
});
書けない事はないけど……という感じです。
0 件のコメント:
コメントを投稿