新井です。

In message "[ruby-dev:20347] 1.8.0 preview3 schedule"
  on Sat, 14 Jun 2003 21:26:13 +0900,
  matz / ruby-lang.org (Yukihiro Matsumoto) wrote:
> まつもと ゆきひろです

> まだ確定してない重要な変更はBlockとProcの分離です。現在の仕様は確定で
> はありません。Blockに合わせた変更は行わないでください。月曜までには決
> 心します。おそらくBlockというクラスはなくなります。

ruby 1.8.0 (2003-06-16) [i586-linux]

ですが、まだ Block という単語がソース上にあります。

% grep -n Block *.[ch]
eval.c:96:VALUE rb_cBlock, rb_cProc;
eval.c:6841:		 proc ? "Proc" : "Block");
eval.c:7152:	b = rb_check_convert_type(block, T_DATA, "Block", "to_proc");
eval.c:7154:	    rb_raise(rb_eTypeError, "wrong argument type %s (expected Block)",
eval.c:7583:	    rb_raise(rb_eTypeError, "wrong argument type %s (expected Block/Method)",
eval.c:7605:	rb_raise(rb_eTypeError, "wrong argument type (expected Block/Method)");
eval.c:7636:    rb_cBlock = rb_cProc;
ruby.h:578:RUBY_EXTERN VALUE rb_cBlock;

それはそれとして、結局 1.6 から比べて何が変わったか解説して
いただけるととてもありがたいです。

・内部的に Block と Proc を区別するようになったが、外見えはいずれもProc?
  ・ Blockは引数チェックがゆるい。breakやnextが例外になる
  ・ Procは引数チェックが厳しい。breakやnextは実行の中断
・Proc.new は Proc を生成して、lambda、proc は Block を生成する?
・今まで、rb_f_lambda() だったものは代わりに rb_block_proc() を使うべき?

    Proc.new {|a,b| p [a,b]}.call(1,2,3)
	=> -:1: wrong # of arguments (3 for 2) (ArgumentError)
		from -:1:in `call'
		from -:1
	   ruby 1.6.8 (2002-12-24) [i586-linux]
	=> ruby 1.8.0 (2003-06-16) [i586-linux]
	   [1, 2]

    lambda {|a,b| p [a,b]}.call(1,2,3)
	=> -:1: wrong # of arguments (3 for 2) (ArgumentError)
		from -:1:in `call'
		from -:1
	   ruby 1.6.8 (2002-12-24) [i586-linux]
	=> -:1: wrong number of arguments (3 for 2) (ArgumentError)
		from -:1:in `call'
		from -:1
	   ruby 1.8.0 (2003-06-16) [i586-linux]

と、Proc.new の方が引数チェックが緩いですね

    Proc.new {|a| p a}.call(1,2,3)
	=> ruby 1.6.8 (2002-12-24) [i586-linux]
	   [1, 2, 3]
	=> -:1: warning: multiple values for a block parameter (3 for 1)
	   ruby 1.8.0 (2003-06-16) [i586-linux]
	   [1, 2, 3]
    lambda {|a| p a}.call(1,2,3)
	=> ruby 1.6.8 (2002-12-24) [i586-linux]
	   [1, 2, 3]
	=> -:1: warning: multiple values for a block parameter (3 for 1)
	   ruby 1.8.0 (2003-06-16) [i586-linux]
	   [1, 2, 3]

と、ブロックパラメータが一つの場合、いずれも警告が出るのはよくわかりません。

私、勘違いしてる可能性が高いです。

--
新井康司 (Koji Arai)