9 ==================================
10 コードを評価する際、OMakeの変数には3つの異なる種類の名前空間があります。変数は *プライベート* なものにしたり、 *現在の* オブジェクトのプロパティを参照したり、 *グローバル* な名前空間の一部として用いることができます。名前空間を指定するには、変数名の前に修飾子を直接明示する必要があります。この3つの名前空間は分割されており、変数は一つ、あるいはさらに多くの名前空間に束縛することができます。 ::
16 # パブリック、グローバルに定義された名前空間
25 ----------------------------------
26 ``private.`` 修飾子は変数が現在のファイルやスコープ上のプライベートなものであると定義したい場合に用います。値は外のスコープから参照することができません。プライベートな変数は静的にスコープされています。 ::
32 println(The value of X is: $X)
35 # The private value of X is: 1
38 # XはObj内のプライベート変数なので、エラーとなります
41 加えて、プライベート変数はグローバルな変数の値に影響を及ぼしません。 ::
46 # このオブジェクトはxのプライベートな値を使用しています
52 println(The private value of x is: $x)
53 println(The public value of x is: $(public.x))
57 # The private value of x is: 3
58 # The public value of x is: 1
61 プライベート変数は2つの性質を持っています。
63 #. プライベート変数は定義されたファイルしか参照できません。
64 #. プライベート変数はたとえ明示的に ``export`` 文を使用したとしてもエクスポートできません。 ::
85 ----------------------------------
86 ``this.`` 修飾子はオブジェクトのローカルなプロパティについて定義したい場合に用います。オブジェクト変数は動的にスコープされます。 ::
90 println(The public value of X is: $(X))
93 # The public value of X is: 2
98 # Xはオブジェクト中の保護されたプロパティを表しています。
103 println(The value of this.X is: $(X))
107 # The value of this.X is: 3
108 # The public value of X is: 1
111 # この文は正しく、Yには3が束縛されます。
114 一般的に、保護されたオブジェクト変数を定義するのは良いとされています。プロジェクトの他の部分で定義された変数と被ってしまったために起こる、意図しないバグを生み出さないためです。その結果、コードはよりモジュール化されます。
121 ----------------------------------
122 ``global.`` 修飾子はグローバルに動的なスコープを持つ変数を定義したい場合に用います。以下の例では、 ``global.`` 宣言は束縛文 ``X = 4`` が動的にスコープされた変数であることを指定しています。グローバル変数はオブジェクトのプロパティとして定義することが *できません* 。 ::
126 println(The global value of X is: $(X))
129 # The global value of X is: 2
138 println(The protected value of X is: $(X))
143 # The protected value of X is: 3
144 # The global value of X is: 4
152 ----------------------------------
153 OMake 0.9.8では、 ``protected`` は ``this`` 修飾子と同義語でした。 ::
160 0.9.9ではこの仕様は変更され、 ``protected`` 修飾子は変数が現在のオブジェクトまたはファイルについてのローカル変数とし、外部からアクセスできないようにしたい場合に用います。
167 ----------------------------------
168 OMake 0.9.8では、 ``public`` は ``global`` 修飾子と同義語でした。 ::
172 osh>value $(global.x)
175 0.9.9ではこの使用は変更され、 ``public`` 修飾子は変数が現在のファイルまたはオブジェクトの外部からアクセスできるようにしたい場合に用います。
180 ----------------------------------
181 もしいくつかの修飾された変数が同時に定義された場合、修飾子のブロックが優先的に定義されます。文法はオブジェクトの定義と似ていますが、それはオブジェクト名それ自体が修飾子だからです。例えば、以下のプログラムはプライベート変数 ``X`` と ``Y`` を定義しています。 ::
187 修飾子はブロック内で新しく定義された変数の、デフォルトの名前空間を指定しています。その違いを除いて、ブロックの中身は完全に普通のコードとしてふるまいます。 ::
192 public.Z = $(add $X, $Y)
193 # "The value of Z is 3" と出力される
194 echo The value of Z is $Z
198 single: 明示的に修飾されていない変数
202 ----------------------------------
203 変数名が修飾されていない場合、その名前空間は最も近くで定義された名前空間か、この変数が定義されているスコープの名前空間が用いられます。私たちは以前すでにこの現象を例を通して見ています。その例では、変数の定義が修飾されていても、その後に来る変数は明示的に修飾されていなかったはずです。以下の例では、最初に宣言された ``$X`` は *プライベート* な変数 ``$(private.X)`` が関連付けられています。なぜならこれは最も近くで定義されているからです。パブリックな変数 ``X`` は未だに ``0`` であり、この変数を指定するためには明示的に修飾しなければなりません。 ::
209 println(The value of private.X is: $X)
210 println(The value of public.X is: $(public.X))
212 時々、修飾子を定義する事なしに変数宣言することが有効である場合があります。例えば、私たちはプログラムの後ろで定義された変数 ``X`` を用いる関数を持っていたとしましょう。 ``declare`` 文はこのような場合に使うことができます。 ::
217 println(The value of X is $X)
219 # "The value of X is 2" と出力される
223 最後に、明示的に修飾されていない変数についてはどうなるのでしょうか?このような場合、以下のルールが使われます。
225 * もし変数が関数の引数ならば、その変数はプライベートとなります。
226 * もし変数がオブジェクト中で定義されているならば、 ``this.`` 修飾子で定義されます。
227 * それ以外はすべてパブリックとなります。