新井です。

In message "[ruby-dev:21510] Re: eval BEGIN/END at runtime"
  on 06 Oct 2003 11:51:15 +0900,
  "NAKAMURA, Hiroshi" <nakahiro / sarion.co.jp> wrote:
> なひです。
> 
> > From: "Yukihiro Matsumoto" <matz / ruby-lang.org>
> > Sent: Monday, October 06, 2003 11:26 AM
> 
> > |runtime(ここでは初期のBEGIN群の実行が終わった後)に、
> > |eval("BEGIN { p 1 }")とすると、その場で実行されます。
> > |eval("END { p 1 }")のほうは、インタプリタ全体の終了時に、
> > |規定の順序で実行されます。
> > 
> > |これは仕様ということでよいでしょうか。あるいは不定?
> > 
> > 仕様のつもりです。
> 
> 了解です。テストに入れておきます。

ちょっと思い出してしまったのですが、以下はかなり昔からなので
すがどういう理由なのでしょう?
# これがわからなくてマニュアルでも不明瞭にしてます
実行されるかどうかわからない END はエラーにしてる?

eval <<END
def foo
  END {p 'foo'}
end
END
=> -:1: compile error (SyntaxError)
   (eval):2: END in method; use at_exit
ruby 1.8.0 (2003-10-05) [i586-linux]

思い出しついでにENDのネストが二重までしか許さないのは意図的
でしょうか?

END {
  print 1;
  END {
    print 2;
    END {
      print 3;
    }
  }
}
=> ruby 1.8.0 (2003-10-05) [i586-linux]
   12

ネストした END が最後に回されるのも仕様でしょうか?
なんとなく、35421 を期待したのですがそうじゃないとしても
別に困りませんが。

END {
  print 1;
}

END {
  print 2;
}

END {
  print 3;
  END {
    print 4;
  }
  END {
    print 5;
  }
}
=> ruby 1.8.0 (2003-10-05) [i586-linux]
   32154

今試してみたら perl(5.8.0) は 35421 ですね。

--
新井康司 (Koji Arai)