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 っぽくなった。