From: Yukihiro Matsumoto Date: 2010-09-29T16:10:27+09:00 Subject: [ruby-dev:42307] Re: Introducing "rb_scan_keyword_args()" (was Re: Re: Enhancing Numeric#step) まつもと ゆきひろです In message "Re: [ruby-dev:42305] Re: Introducing "rb_scan_keyword_args()" (was Re: Re: Enhancing Numeric#step)" on Wed, 29 Sep 2010 11:21:09 +0900, "Akinori MUSHA" writes: | もうだいぶ経つので後ほど入れようと思います。以下のようなAPIです。 いれることそのものには反対ではないんですが、 |num-of-mandatory-args := DIGIT ; The number of mandatory | ; keywords | |sym-for-capture := "*" ; Indicates that all the | ; keywords that are not on the | ; list should be captured as a | ; ruby hash. |sym-for-raise := "!" ; Indicates that an | ; ArgumentError should be | ; raised if any keyword that | ; are not on the list is given. |sym-for-warning := "" ; Indicates that a soft warning | ; should be emitted raised if | ; any keyword that are not on | ; the list is given. この辺の文法は好みではありません。 引数をシンボルにしたのでこのようになっているのだと思いますが、 個人的には * シンボルでなく文字列 * 文字列末尾に:がついていたらoptional または文字列末尾に!がついていたらmandatory * "*" があれば残りがハッシュとして渡る * "*" が指定されていなければ例外 * soft warningはなし を考えていました。あと関数名はrb_scan_keyword_argsじゃなくて、 rb_keyword_argsがいいかなあ。 | /* | * The keywords and are mandatory, and is optional; | * If any other keyword arguments are given, an ArgumentError is raised. | */ | rb_scan_keyword_args(opt, "2!", | rb_intern("x"), &x, rb_intern("y"), &y, | rb_intern("color"), &color, NULL); は rb_scan_keyword_args(opt, "x", &x, "y", &y, "color:", &color, NULL); となり、 | /* | * The keywords and are mandatory, and is optional; | * If other keyword arguments are given, they are packed into a hash | * and assigned to the variable rest. | */ | rb_scan_keyword_args(opt, "2*", | rb_intern("x"), &x, rb_intern("y"), &y, | rb_intern("color"), &color, NULL, &rest); rb_scan_keyword_args(opt, "x", &x, "y", &y, "color:", &color, "*", &rest, NULL); | /* Unknown parameters can just be dropped by passing a NULL. */ | rb_scan_keyword_args(opt, "2*", | rb_intern("x"), &x, rb_intern("y"), &y, | rb_intern("color"), &color, NULL, NULL); rb_scan_keyword_args(opt, "x", &x, "y", &y, "color:", &color, "*", NULL, NULL); | /* | * The keywords , , and are all optional; | * If any other keyword arguments are given, a soft warning (only | * reported in verbose mode) is emitted. | */ | rb_scan_keyword_args(opt, "0", | rb_intern("x"), &x, rb_intern("y"), &y, | rb_intern("color"), &color, NULL); | rb_scan_keyword_args(opt, "x:", &x, "y:", &y, "color:", &color, NULL); というのを考えていました。 まつもと ゆきひろ /:|)