[#42194] Enhancing Numeric#step — "Akinori MUSHA" <knu@...>

 Numeric#step の仕様の拡張を提案します。

26 messages 2010/09/08
[#42196] Re: Enhancing Numeric#step — Yukihiro Matsumoto <matz@...> 2010/09/08

まつもと ゆきひろです

[#42200] Re: Enhancing Numeric#step — "Akinori MUSHA" <knu@...> 2010/09/08

At Wed, 8 Sep 2010 22:46:57 +0900,

[#42204] Re: Enhancing Numeric#step — Yukihiro Matsumoto <matz@...> 2010/09/09

まつもと ゆきひろです

[#42232] 1.9.2 readline can't handle cursorkeys, mbcs chars etc (msvcrt) — arton <artonx@...>

artonです。

11 messages 2010/09/10

[#42269] [Ruby 1.9-Bug#3836] Kernel.system, spawnがスペースを含むパスで動作しない — Hiroki Najima <redmine@...>

チケット #3836 が更新されました。 (by Hiroki Najima)

12 messages 2010/09/16
[#42270] WindowsでのKernel.systemの挙動、一貫性について — NAJIMA Hiroki <h.najima@...> 2010/09/16

名島(Nazy)と申します。

[#42310] ビジースレッドがあるとコンテキストスイッチが起きづらくなる — kuwamoto shintaro <beuniv@...>

こんにちは。

9 messages 2010/09/29
[#42315] [bug:trunk] ビジースレッドがあるとコンテキストスイッチが起きづらくなる — "U.Nakamura" <usa@...> 2010/09/30

こんにちは、なかむら(う)です。

[ruby-dev:42244] Re: Introducing "rb_scan_keyword_args()" (was Re: Re: Enhancing Numeric#step)

From: "Akinori MUSHA" <knu@...>
Date: 2010-09-13 03:48:37 UTC
List: ruby-dev #42244
At Sun, 12 Sep 2010 19:51:21 +0900,
I wrote:
> At Thu, 9 Sep 2010 09:59:45 +0900,
> matz wrote:
> > でキーワード辞書を取れたり、
> >
> >   rb_scan_keywords(kw, "by", &step, "to", &limit, NULL);
> >
> > で、キーワード辞書を分解したりするようなAPIはどうだろうかと
> > 考えています。
>
>  少し考えてから、 rb_scan_keyword_args() というものを設計・実装
> してみました。仕様は以下の差分中に(日本語も)あるので見てみて
> ください。
>
>  改良点として、 fmt の頭に ':' を置くと、キーワード名として
> const char * でなく ID を取るという機能を付けると、何度も呼び
> 出されることを考慮して効率のために rb_intern() の結果を取って
> おくようなところでも使えるのかなと思っています。

 rb_intern() 程度の手間は強いてもいいかなと思ったので、IDを取る
ようにしました。(パッチは省きます)

>  まあ、そこはAPI仕様としては枝葉として、幹としての機能はこれで
> いかがでしょうか。

 想定されるRubyのAPIと対比してみると、こういう感じです。

    # 省略可能キーワード
    argc = rb_scan_keyword_args(argc, argv, "2:", &x, &y, &opt);
    rb_scan_keyword_args(opt, "*", rb_intern("color"), &color, 0, &rest);

    def point(x, y, color: color = :DEFAULT, **rest)
    end

    # 必須キーワード
    argc = rb_scan_keyword_args(argc, argv, "2:", &x, &y, &opt);
    rb_scan_keyword_args(opt, "1*", rb_intern("color"), &color, 0, &rest);

    def point(x, y, color: color, **rest)
    end

    # 残りを読み捨て
    argc = rb_scan_keyword_args(argc, argv, "2:", &x, &y, &opt);
    rb_scan_keyword_args(opt, "1*", rb_intern("color"), &color, 0, NULL);

    def point(x, y, color: color, **rest)
    end

    # 知らないキーワードはwarning
    argc = rb_scan_keyword_args(argc, argv, "2:", &x, &y, &opt);
    rb_scan_keyword_args(opt, "1", rb_intern("color"), &color, 0);

    def point(x, y, color: color, **rest)
      warn "unknown keywords: #{rest.keys.inspect}" if rest && $VERBOSE
    end

    # 知らないキーワードはArgumentError
    argc = rb_scan_keyword_args(argc, argv, "2:", &x, &y, &opt);
    rb_scan_keyword_args(opt, "1!", rb_intern("color"), &color, 0);

    def point(x, y, color: color)
    end

--
Akinori MUSHA / http://akinori.org/

In This Thread