原です。

In message "[ruby-dev:3314] Re: REQUEST id2name"
    on 98/07/16, Yukihiro Matsumoto <matz / netlab.co.jp> writes:

|まつもと ゆきひろです

||名前も気に入らないんでしょうきっと。(^^;
|
|名前はそれほどでもないです.採用するならきっと define_method 
|にするでしょうけど.問題はスコープですね.

やはり、、、

ブロックで define_method ができるとすると次の様に見かけ上イ
ンスタンス変数が once から消えて面白いかなと思ったんです。
(once の仕様としてはいまいちだが)

### 001
def define_method(n)
  @method001 = proc
  eval("def self.#{n.id2name}; @method001.call; end")
end
###

def who_calls?
  caller(2)[0] =~ /`(.+)'/; $1.intern
end

def once
  result = yield
  define_method(who_calls?) { result }
  result
end

class Foo
  def bar
    once {
      print "do once.\n"
      "hello.\n"
    }
  end
end

foo = Foo.new
print foo.bar
print foo.bar
print foo.bar