2005-07-20 (Wed) [長年日記]
_ Rubyist のための他言語探訪 【第 1 回】 Python
次回は、Ruby に影響を与えた言語の一つ、CLU を紹介する予定です。 お楽しみに!
[Rubyist Magazine - Rubyist のための他言語探訪 【第 1 回】 Pythonより引用]
おお。
_ ECMAScript 4 Namespaces
今さらながらECMAScript 4のnamespaceの仕様を勉強。 ちょっとややこしいのが、x.nのようなプロパティ参照によって、どのように プロパティ(JavaScriptだとメソッドもプロパティ)が検索されるか。
まず、すべてのプロパティはq::nCのように修飾された名前を持つ。 ここで、qはnamespace、nは識別子、Cはクラスである。
次に、xを評価するとインスンスになるような式、Σをプロパティ参照を含むすべてのスコープの集合、QをΣのスコープでuseされているすべてのnamespaceの集合とする。
x.nのようにnamespaceを明示せずにプロパティを参照した場合、次のような探索が行われる。
- Aを、xが少なくとも一つのq::nA(qはQの任意の要素)という プロパティを持つ、最も派生していない(Objectに近い)クラスとする。 もし、そのようなプロパティがなければエラー。
- Q'を、Qに属し、xがq::nAというプロパティを持つすべてのnamespaceの集合とする。
- Pを、xのq::n(qはQ'の要素)というプロパティのうち最も派生的なすべての プロパティの集合とする。
- もし、Pがただ一つの要素pを持つ、あるいはPのすべての要素が一つのプロパティp の別名である場合、pを選択する。それ以外の場合はエラー。
興味深いのは、まず最もObjectに近いクラスに定義されたプロパティを探して、 namespaceの候補を絞りこむ点。 同じ識別子を持つプロパティでも、起源となるクラスによって区別することが できるということか。
あと、namespaceに関しては、
# String#lengthの定義 class String { function length() { ... } } # jcodeというnamespaceの定義 namespace jcode # jcodeにString#lengthを定義 class String { jcode function length() { ... } } # MyString#lengthを定義 class MyString { function length() { ... } } # jcodeの使用を宣言 use jcode s = new MyString("あいうえお") len = s.length()
とした時に、s.length()が呼び出すのが、jcodeのString#lengthなのか、 MyString#lengthなのか、というのが疑問だった。 ECMAScriptでは、デフォルトのnamespaceはpublicというnamespaceで、 明示的にuseしなくても利用できるらしい。 ということは、MyString#lengthが呼び出されるのだろうか。