読者です 読者をやめる 読者になる 読者になる

Perl - __SUB__ を使う

JavaScript The Good Parts ―「良いパーツ」によるベストプラクティス の 51 ページでメモ化(関数内部に値を覚えておくこと、クロージャ)の例としてフィボナッチ数列を返す関数が載ってる。

だいたい次のような感じ。

#!/usr/bin/env node

var fibonacci, i;

fibonacci = (function () {
    var memo = [0, 1];
    return function fib(i) {
        if (i >= memo.length) {
            memo[i] = fib(i - 1) + fib(i - 2);
        }
        return memo[i];
    };
}());

for (i = 0; i < 100; i++) {
    console.log(fibonacci(i));
}

さて、Perl 5.16.0 がリリースされて「現在のサブルーチンのリファレンス」を表す __SUB__ が使えるようになったので、同じことが Perl でも簡単にできるようになった。実際

#!/usr/bin/env perl
use strict;
use warnings;
use feature qw{:5.16};

my $fibonacci = sub {
    my @memo = (0, 1);
    return sub {
        my $i = shift;
        if (!exists $memo[$i]) {
            $memo[$i] = __SUB__->($i - 1) + __SUB__->($i - 2);
        }
        return $memo[$i];
    };
}->();

for my $i (0 .. 100) {
    say $fibonacci->($i);
}

で同じことができる。JavaScript っぽくなった。