あなたが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 件のコメント:
コメントを投稿