2013年12月1日日曜日

Perlでwithな感じ

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

コメントを投稿