まつもと ゆきひろです

In message "[ruby-dev:20357] Re: 1.8.0 preview3 schedule"
    on 03/06/17, Koji Arai <JCA02266 / nifty.ne.jp> writes:

|ですが、まだ 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 を生成する?

という説明の仕方は混乱を招くので、

  * Proc.newおよびブロック引数で与えられるProcは、引数チェッ
    クがゆるい。breakやnextが例外になる
  * lambdaおよびprocが返すProcは、引数チェックが厳しい。
    breakやnextは実行の中断

という説明にしましょう。

|・今まで、rb_f_lambda() だったものは代わりに rb_block_proc() を使うべき?

はい。

|    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]
|
|と、ブロックパラメータが一つの場合、いずれも警告が出るのはよくわかりません。

ブロックパラメータがひとつの場合には、今回の件とは独立にブロッ
クパラメータの使い方を矯正するために警告を出してます。

つまり、以前は|a|は解釈として|a,|(引数が一つの時)と|*a|(引数
が複数の時)の中間の働きをしていましたが、これを|a,|と同じ解
釈にするための移行措置です。

                                まつもと ゆきひろ /:|)