遠藤です。

# redmine の 2.0 tracker にチケットを登録したのですが、メールが
# 流れないようです。パッチはチケットを見てください。
# http://redmine.ruby-lang.org/issues/5454


キーワード引数を実装してみました。

 $ cat t.rb
 def foo(str: "foo", num: 424242)
   p [str, num]
 end
 foo(str: "bar")

 $ ./ruby t.rb
 ["bar", 424242]

細かいことはまだ気にしていませんが、キーワード引数が 2.0 に入る
ことはかなり確定的なので、とりあえず trunk に入れて考えるという
のはどうでしょうか。

一応私の環境では make check は通ります (キーワード引数のテスト
は書いてないですが) 。パーサに conflict はないです。
既存のベンチマークを見ると、一部気になる項目もありますが (vm1_
rescue とか) 、全体的には特に速度劣化しないようです。


以下は未実装・懸案です。

 - 残りのキーワード引数を受け取る方法が必要か

   def foo(str: "foo", num: 424242, **h)
     p h
   end
   foo(str: "bar", check: true)  #=> { :check => true }

 - nil が渡されたらやはり nil になるべき?

   def foo(str: "foo")
     p str
   end
   foo(str: nil) #=> nil ? (今は手抜きで "foo")

 - rest なしで知らないキーワードが来たら例外・警告を発して
   欲しい?

   def foo(str: "foo", num: 424242)
   end
   foo(check: true) #=> ArgumentError?

 - Hash のように振る舞うオブジェクトもキーワード引数として
   解釈すべき? (現在は速度重視で T_HASH だけ見ている)

 - 引数の順番はよいか

   def foo(
     a, b, c,     # mandatory arguments
     opt = 1,     # optional arguments
     *rest,       # rest argument
     x, y, z,     # post mandatory arguments
     k1: 1, k2:2, # keyword arguments
     **kh,        # keyword rest argument
     &blk         # block argument
   )

 - 他いろいろ

--
Yusuke Endoh <mame / tsg.ne.jp>