理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

その発想はなかった

せっかくはてなに来て、とにかくシンタックス・ハイライトを使いたくて機を伺っていたのですが、ぜんぜん機がこないので、流れとか空気とか無視して使ってみます。なんかちょうど面白いソースがあったので。


List::Utilというと、そこそこ有名なPerlモジュールだったりします。まぁ何をするかというと、配列の中から最大値を求めるとか、総和を求めるとか、そういう小さなモジュールなのです。きっとfor文とかでゴリゴリ書いてんだろうなと思ってたんですが、実際にはこんな風に書いてました。

sub sum (@) { reduce { $a + $b } @_ }

sub max (@) { reduce { $a > $b ? $a : $b } @_ }

でreduceってのはどうなってるかっていうと、

sub reduce (&@) {
  my $code = shift;
  no strict 'refs';

  return shift unless @_ > 1;

  use vars qw($a $b);

  my $caller = caller;
  local(*{$caller."::a"}) = \my $a;
  local(*{$caller."::b"}) = \my $b;

  $a = shift;
  foreach (@_) {
    $b = $_;
    $a = &{$code}();
  }

  $a;
}

つうわけで、その発想はなかったわwwwって話につながるわけです。for文には違いないと言えば違いないのですが配列走査の共通部分の括りだしと、呼び出される側の名前空間へのアクセス。まぁこんなエントリをあげてしまうと、STL使ってりゃこういう発想ぐらい出てくるだろwwwとか、関数型やってりゃこのくらいの発想でてくるだろwwwとか、そういう話になりかねないのですが、傷つくので遠慮のほどをよろしくおねがいします。脊髄で考えてたら、for文でゴリゴリしか思い浮かばなかったとか、そういう悲しいお話。全米が泣いた


てか、ホントはてなはきっちりparseしてくれるんですね。色分けバッチリ。