名前付き無名関数

lambdaを生成する関数を多用すると、pで出力したlambdaが一体何をするlambdaなのかわかりにくくなる場合があります(通常lambdaをinspectするとファイル名と行番号は表示されるのですが、lambdaを生成する関数経由で生成すると同じファイル名、行番号になってしまいます)。
で、これを何とかしたいなぁと思って、以下のようにlambdaを置き換える関数を定義してみました。

module Kernel
  alias __lambda__ lambda

  def lambda(name = nil, &block)
    f = __lambda__(&block)
    if name
      f.instance_variable_set(:@name, name) 
      def f.inspect
        super.chop + " @name=#{@name.inspect}>"
      end
    end
    f
  end
end

f1 = lambda {|a, b| a + b }
p f1         # => #<Proc:0x02b36d00@a.rb:18> 普通にlambdaとして使えます。
p f1[10, 20] # => 30

f2 = lambda('add') {|a, b| a + b }
p f2         # => #<Proc:0x02b369b8@a.rb:22 @name="add"> @nameが追加されます。
p f2[10, 20] # => 30

無名関数なのに名前付きというわけのわからないものになってしまいました。