2013年12月3日火曜日

Perl関連のサイトのメモ

最近、見始めたサイトです。英語圏のPerl関連のニュースがまとまってていい感じです。

advent calendar 2013も始まりました。

野田さんが可愛かったので

新人女子プログラマの書いたコードを直すだけの簡単なお仕事です!|paizaオンラインハッカソンVol.1を、やってみました。

E判定

hirontさん、ある意味凄いコードですね。新人の私でもそうそうこんなコードかけませんよ。。

E判定より
S判定

hirontさん、凄いコードですねっ!!私にはこんな効率のいいコード書けませんっ!

S判定より

野田s……涙拭いてもいいですか。

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);
});

書けない事はないけど……という感じです。