OSDN Git Service

第13章翻訳完了.
[omake-japanese/omake_trans.git] / language-naming.rst
1 .. 5-language-naming
2
3 .. index:
4    single: 修飾子
5    single: 名前空間
6 .. _label5:
7
8 5. 変数と名前空間
9 ==================================
10 コードを評価する際、OMakeの変数には3つの異なる種類の名前空間があります。変数は *プライベート* なものにしたり、 *現在の* オブジェクトのプロパティを参照したり、 *グローバル* な名前空間の一部として用いることができます。名前空間を指定するには、変数名の前に修飾子を直接明示する必要があります。この3つの名前空間は分割されており、変数は一つ、あるいはさらに多くの名前空間に束縛することができます。 ::
11
12     # プライベートな名前空間
13     private.X = 1
14     # 現在のオブジェクト
15     this.X = 2
16     # パブリック、グローバルに定義された名前空間
17     global.X = 3
18
19 .. index::
20    single: private.
21    single: export
22 .. _label5.1:
23
24 5.1 private.
25 ----------------------------------
26 ``private.`` 修飾子は変数が現在のファイルやスコープ上のプライベートなものであると定義したい場合に用います。値は外のスコープから参照することができません。プライベートな変数は静的にスコープされています。 ::
27
28     Obj. =
29        private.X = 1
30
31        print() =
32           println(The value of X is: $X)
33
34     # 出力:
35     #    The private value of X is: 1
36     Obj.print()
37
38     # XはObj内のプライベート変数なので、エラーとなります
39     y = $(Obj.X)
40
41 加えて、プライベート変数はグローバルな変数の値に影響を及ぼしません。 ::
42
43    # パブリックなxの値は1
44    x = 1
45
46    # このオブジェクトはxのプライベートな値を使用しています
47    Obj. =
48        private.x = 2
49
50        print() =
51           x = 3
52           println(The private value of x is: $x)
53           println(The public value of x is: $(public.x))
54           f()
55
56    # 出力:
57    #    The private value of x is: 3
58    #    The public value of x is: 1
59    Obj.print()
60
61 プライベート変数は2つの性質を持っています。
62
63 #. プライベート変数は定義されたファイルしか参照できません。
64 #. プライベート変数はたとえ明示的に ``export`` 文を使用したとしてもエクスポートできません。 ::
65
66          private. =
67             FLAG = true
68
69          section
70             FLAG = false
71             export
72
73          # FLAGはまだtrueです
74          section
75             FLAG = false
76             export FLAG
77
78          # FLAGは現在falseです
79
80 .. index::
81    single: this.
82 .. _label5.2:
83
84 5.2 this.
85 ----------------------------------
86 ``this.`` 修飾子はオブジェクトのローカルなプロパティについて定義したい場合に用います。オブジェクト変数は動的にスコープされます。 ::
87
88     X = 1
89     f() =
90        println(The public value of X is: $(X))
91
92     # 出力:
93     #    The public value of X is: 2
94     section
95        X = 2
96        f()
97
98     # Xはオブジェクト中の保護されたプロパティを表しています。
99     Obj. =
100        this.X = 3
101
102        print() =
103           println(The value of this.X is: $(X))
104           f()
105
106     # 出力:
107     #    The value of this.X is: 3
108     #    The public value of X is: 1
109     Obj.print()
110
111     # この文は正しく、Yには3が束縛されます。
112     Y = $(Obj.X)
113
114 一般的に、保護されたオブジェクト変数を定義するのは良いとされています。プロジェクトの他の部分で定義された変数と被ってしまったために起こる、意図しないバグを生み出さないためです。その結果、コードはよりモジュール化されます。
115
116 .. index::
117    single: global.
118 .. _label5.3:
119
120 5.3 global.
121 ----------------------------------
122 ``global.`` 修飾子はグローバルに動的なスコープを持つ変数を定義したい場合に用います。以下の例では、 ``global.`` 宣言は束縛文 ``X = 4`` が動的にスコープされた変数であることを指定しています。グローバル変数はオブジェクトのプロパティとして定義することが *できません* 。 ::
123
124     X = 1
125     f() =
126        println(The global value of X is: $(X))
127
128     # 出力:
129     #    The global value of X is: 2
130     section
131        X = 2
132        f()
133
134     Obj. =
135        protected.X = 3
136
137        print() =
138           println(The protected value of X is: $(X))
139           global.X = 4
140           f()
141
142     # 出力:
143     #    The protected value of X is: 3
144     #    The global value of X is: 4
145     Obj.print()
146
147 .. index::
148    single: protected.
149 .. _label5.4:
150
151 5.4 protected.
152 ----------------------------------
153 OMake 0.9.8では、 ``protected`` は ``this`` 修飾子と同義語でした。 ::
154
155     osh>protected.x = 1
156     - : "1" : Sequence
157     osh>value $(this.x)
158     - : "1" : Sequence
159
160 0.9.9ではこの仕様は変更され、 ``protected`` 修飾子は変数が現在のオブジェクトまたはファイルについてのローカル変数とし、外部からアクセスできないようにしたい場合に用います。
161
162 .. index::
163    single: public.
164 .. _label5.5:
165
166 5.5 public.
167 ----------------------------------
168 OMake 0.9.8では、 ``public`` は ``global`` 修飾子と同義語でした。 ::
169
170     osh>public.x = 1
171     - : "1" : Sequence
172     osh>value $(global.x)
173     - : "1" : Sequence
174
175 0.9.9ではこの使用は変更され、 ``public`` 修飾子は変数が現在のファイルまたはオブジェクトの外部からアクセスできるようにしたい場合に用います。
176
177 .. _label5.6:
178
179 5.6 修飾されたブロック
180 ----------------------------------
181 もしいくつかの修飾された変数が同時に定義された場合、修飾子のブロックが優先的に定義されます。文法はオブジェクトの定義と似ていますが、それはオブジェクト名それ自体が修飾子だからです。例えば、以下のプログラムはプライベート変数 ``X`` と ``Y`` を定義しています。 ::
182
183     private. =
184         X = 1
185         Y = 2
186
187 修飾子はブロック内で新しく定義された変数の、デフォルトの名前空間を指定しています。その違いを除いて、ブロックの内容は完全に普通のコードとしてふるまいます。 ::
188
189     private. =
190         X = 1
191         Y = 2
192         public.Z = $(add $X, $Y)
193         # "The value of Z is 3" と出力される
194         echo The value of Z is $Z
195
196 .. index::
197    single: declare
198    single: 明示的に修飾されていない変数
199 .. _label5.7:
200
201 5.7 変数宣言
202 ----------------------------------
203 変数名が修飾されていない場合、その名前空間は最も近くで定義された名前空間か、この変数が定義されているスコープの名前空間が用いられます。私たちは以前すでにこの現象を例を通して見ています。その例では、変数の定義が修飾されていても、その後に来る変数は明示的に修飾されていなかったはずです。以下の例では、最初に宣言された ``$X`` は *プライベート* な変数 ``$(private.X)`` が関連付けられています。なぜならこれは最も近くで定義されているからです。パブリックな変数 ``X`` は未だに ``0`` であり、この変数を指定するためには明示的に修飾しなければなりません。 ::
204
205     public.X = 0
206     private.X = 1
207     
208     public.print() =
209         println(The value of private.X is: $X)
210         println(The value of public.X is: $(public.X))
211
212 時々、修飾子を定義する事なしに変数宣言することが有効である場合があります。例えば、私たちはプログラムの後ろで定義された変数 ``X`` を用いる関数を持っていたとしましょう。 ``declare`` 文はこのような場合に使うことができます。 ::
213
214     declare public.X
215
216     public.print() =
217         println(The value of X is $X)
218
219     # "The value of X is 2" と出力される
220     X = 2
221     print()
222
223 最後に、明示的に修飾されていない変数についてはどうなるのでしょうか?このような場合、以下のルールが使われます。
224
225 * もし変数が関数の引数ならば、その変数はプライベートとなります。
226 * もし変数がオブジェクト中で定義されているならば、 ``this.`` 修飾子で定義されます。
227 * それ以外はすべてパブリックとなります。