IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

Perl の y 関数を JS で

(追記)このエントリーは間違いが含まれます。

y 関数は y コンビネータではなくて、他の用途の組み込み関数を上書きして autobox でそういう風に使っているという話でした。




Perl の y 関数

http://d.hatena.ne.jp/tokuhirom/20080205/1202191116
Perl には y 関数というものがあって、 Autobox を使うと以下のように使えるらしい
http://search.cpan.org/~stevan/Moose-Autobox-0.06/lib/Moose/Autobox/Code.pm

 *factorial = sub {
    my $f = shift;
    sub {
        my $n = shift;
        return 1 if $n < 2;
        return $n * $f->($n - 1);
    }
}->y;

JavaScript でも作ってみた

Function.prototype.__defineGetter__('y', function() {
  var f = this;
  return function g(m) {
    return f(g)(m);
  };
});

var f = (function(f) {
  return function(n) {
    return n < 2 ? 1 : n*f(n - 1)
  }
}).y;

f(7)

まあ、出来てあたりまえか。 Perl で出来ることがすごいって話でしたね。