dddddmapとか作るとよくね?

http://d.hatena.ne.jp/ku-ma-me/20090312 を見て思ったんだけど、

x.ddmap.f ==> x.dmap.f.dmap
x.dddmap.f ==> x.dmap.f.ddmap
x.ddddmap.f ==> x.dmap.f.dddmap

とか作れば

x.map{|y|y*3/5+2}

とかが

x.dddmap*3/5+2

ってできて便利じゃね。

適当にこぴってきて実装した(Ruby1.8だけど)

module Enumerable
  def dmap(n=1)
    DelegateMap.new(n, self)
  end
  2.upto(10) {|n|
    eval "def #{'d'*n}map; dmap(#{n}); end"
  }
end

class DelegateMap
  def initialize(n, enum)
    @n = n
    @enum = enum
  end
  def method_missing(mhd, *args, &blk)
    r = @enum.map {|elem| elem.__send__(mhd, *args, &blk) }
    @n > 1 ? r.dmap(@n-1) : r
  end
end

これを使うと

[[[[[1]]]]].dddddmap.ddddmap.dddmap.ddmap.dmap*5
=> [[[[[5]]]]]

みたいに多重配列の中に簡単に入るようになる(ぉ

[[[[[1]]]]].ddddddmap.dddddmap.ddddmap.dddmap.ddmap*5+3
=> [[[[[8]]]]]

こんなのも簡単にできるし、必要な文字数もO(2^n)からO(n^2)に大幅ダウンだ。