[#27417] selector namespace — Shugo Maeda <shugo@...>

前田です。

17 messages 2005/10/13

[#27458] Matrix class is broken without mathn — akira yamada / やまだあきら <akira@...>

Debianユーザからrequire "mathn"しないときに

28 messages 2005/10/19
[#27461] Re: Matrix class is broken without mathn — Yukihiro Matsumoto <matz@...> 2005/10/19

まつもと ゆきひろです

[#27596] Re: Matrix class is broken without mathn — Masahiro Sakai (酒井政裕) <sakai@...> 2005/10/31

酒井といいます。

[#27601] Re: Matrix class is broken without mathn — Yukihiro Matsumoto <matz@...> 2005/10/31

まつもと ゆきひろです

[#27605] Re: Matrix class is broken without mathn — keiju@... (石塚圭樹) 2005/10/31

けいじゅ@いしつかです.

[#27691] Re: Matrix class is broken without mathn — Shin-ichiro HARA <sinara@...> 2005/11/12

原です。

[#27700] Re: Matrix class is broken without mathn — keiju@... (石塚圭樹) 2005/11/14

けいじゅ@いしつかです.

[#27484] 1.8.4 feature freeze? — "URABE Shyouhei aka. mput" <root@...>

卜部です。

19 messages 2005/10/23
[#27485] Re: 1.8.4 feature freeze? — Yukihiro Matsumoto <matz@...> 2005/10/23

まつもと ゆきひろです

[#27492] Re: [ ruby-Bugs-2613 ] building ruby 1.8.3 on Solaris — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。

20 messages 2005/10/24
[#27493] Re: [ ruby-Bugs-2613 ] building ruby 1.8.3 on Solaris — Yukihiro Matsumoto <matz@...> 2005/10/24

まつもと ゆきひろです

[#27494] Re: [ ruby-Bugs-2613 ] building ruby 1.8.3 on Solaris — WATANABE Hirofumi <eban@...> 2005/10/24

わたなべです。

[#27495] Re: [ ruby-Bugs-2613 ] building ruby 1.8.3 on Solaris — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/10/24

山本です。

[#27503] Re: [ ruby-Bugs-2613 ] building ruby 1.8.3 on Solaris — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/10/25

山本です。

[#27504] Re: [ ruby-Bugs-2613 ] building ruby 1.8.3 on Solaris — "U.Nakamura" <usa@...> 2005/10/25

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

[#27505] Re: [ ruby-Bugs-2613 ] building ruby 1.8.3 on Solaris — nobuyoshi nakada <nobuyoshi.nakada@...> 2005/10/25

なかだです。

[#27551] 1.8.4 検証を(だれが|どのように)行うか — "URABE Shyouhei aka.mput" <root@...>

さて、 1.8.4-Preview1

41 messages 2005/10/28
[#27561] Re: 1.8.4 検証を(だれが|どのように)行うか — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/10/30

山本です。

[#27562] Re: 1.8.4 検証を(だれが�匹里茲Δ�)行うか — "URABE Shyouhei aka.mput" <root@...> 2005/10/30

卜部です。

[#27566] Re: 1.8.4 検証を(だれが|どのように)行うか — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/10/30

山本です。

[#27586] Re: 1.8.4 検証を(だれが|どのように)行うか — "U.Nakamura" <usa@...> 2005/10/31

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

[#27587] Re: 1.8.4 検証を(だれが|どのように)行うか — Yukihiro Matsumoto <matz@...> 2005/10/31

まつもと ゆきひろです

[ruby-dev:27417] selector namespace

From: Shugo Maeda <shugo@...>
Date: 2005-10-13 02:57:20 UTC
List: ruby-dev #27417
前田です。

selector namespaceを導入しませんか?、という提案です。
いつもまつもとさんに「よくわからないから」と逃げられるので、
ECMAScriptを参考に仕様についても考えてみました。

基本的なコンセプトは、メソッド名を拡張して名前空間を利用
できるようにするというものです。
名前空間と(修飾されていない)メソッド名の区切り文字を何に
するかが悩ましいところ(::が自然ですが、他と衝突するので)
ですが、ここでは仮に$を使うことにします(御推察の通りCLUから
取ったものです)。

たとえば、

class Foo
  def bar$baz
    puts "Foo#bar$baz"
  end
end

のようにメソッドを定義すると、Fooクラスに、fooという名前空間の
barというメソッドを定義します。

呼び出す時は、

foo = Foo.new
foo.bar$baz

のように呼び出します。

これだけでは、毎回名前空間を指定しないといけないので、あまり
うれしさがありません。そこで、usingという予約語を導入して、
名前空間を省略できるようにします。

using bar
foo = Foo.new
foo.baz #=> Foo#bar$bazの呼び出し

usingが効力を及ぼす範囲が、静的なスコープであるとします。
具体的には、ファイル単位か、クラス・モジュールの単位がよいのでは
ないかと思います。

  def bar
  end

のように、メソッド名が名前空間で修飾されていない場合は、global
という特殊な名前空間にメソッドが定義されているものとします。
つまり、上記は、

  def global$baz
  end

の省略形です。
また、globalという名前空間はデフォルトでusingされているものとします。

文法を別にすれば、ここまではあまり問題ないかと思います。
問題は継承とからむケースです。
たとえば、

class String
  def jcode$length
  end
end

class MyString < String
  def length
  end
end

のようなメソッド定義があった場合、

using jcode
s = MyString.new("あいうえお")
p s.length

という呼び出しで、どちらの定義が呼び出されるべきでしょう?
私の提案する仕様では、答えはMyString#lengthです。
メソッド探索のルールは単純で、

(1) 継承関係で下位(サブクラス側)のクラス・モジュールから順に探索。
(2) 対象のクラス・モジュールで定義されている、usingされている名前空間の
    lengthメソッドをすべて探す(ここではjcode$lengthとglobal$length)。
(3) そのクラス/モジュールに該当メソッドが複数ある場合はエラー。
    ただし、該当メソッドが二つで、一方がglobalである場合、global
    でない方を採用する。
(4) そのクラス/モジュールに該当メソッドがない場合は上位のクラス・
    モジュールを探索((2)に戻る)。

というものです。
ECMAScriptの仕様はもっと複雑(http://shugo.net/jit/20050720.html#p02)
なのですが、上記くらいのわかりやすいルールでよいように思います。

予想される反対意見に、「jcode$lengthの方を優先させる方が便利なケースも
あるのではないか」というものがありますが、そういう場合は以下のように
名前空間で修飾されたメソッド呼び出しをしてください、というのが答えです。

p s.jcode$length

以上、夜行バスで寝ぼけ頭で考えただけなので穴があるかとは思いますが、
議論の叩き台になれば幸いです。

-- 
前田 修吾

In This Thread

Prev Next