Journal InTime


2005-07-20 (Wed) [長年日記]

_ Rubyist のための他言語探訪 【第 1 回】 Python

次回は、Ruby に影響を与えた言語の一つ、CLU を紹介する予定です。 お楽しみに!

[Rubyist Magazine - Rubyist のための他言語探訪 【第 1 回】 Pythonより引用]

おお。

Tags: 言語

_ ECMAScript 4 Namespaces

今さらながらECMAScript 4のnamespaceの仕様を勉強。 ちょっとややこしいのが、x.nのようなプロパティ参照によって、どのように プロパティ(JavaScriptだとメソッドもプロパティ)が検索されるか。

まず、すべてのプロパティはq::nCのように修飾された名前を持つ。 ここで、qはnamespace、nは識別子、Cはクラスである。

次に、xを評価するとインスンスになるような式、Σをプロパティ参照を含むすべてのスコープの集合、QをΣのスコープでuseされているすべてのnamespaceの集合とする。

x.nのようにnamespaceを明示せずにプロパティを参照した場合、次のような探索が行われる。

  1. Aを、xが少なくとも一つのq::nA(qはQの任意の要素)という プロパティを持つ、最も派生していない(Objectに近い)クラスとする。 もし、そのようなプロパティがなければエラー。
  2. Q'を、Qに属し、xがq::nAというプロパティを持つすべてのnamespaceの集合とする。
  3. Pを、xのq::n(qはQ'の要素)というプロパティのうち最も派生的なすべての プロパティの集合とする。
  4. もし、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が呼び出されるのだろうか。

Tags: 言語