プロデルを書いていて気になるのは,変数のスコープ(有効範囲)ですよね。
本家マニュアルにも当該項目がありますが,よく迷うので,まとめました。
変数が発生するとき
プロデルは変数を宣言しないで使うことができますが,宣言をすることもできます。
パターン1:代入と同時
甲は,「あ」。
パターン2:【】
【甲】
パターン3:種類
乙とは
+あ
-い
#う
え ’エラー
終わり
識別子を省略すると+になりますが,この場合変数名を書くだけだとエラーです。
パターン4:引数
[甲]を乙する手順
終わり
パターン5:繰り返し
3回甲にカウントしながら繰り返す
繰り返し終わり
甲は,{1,2,3}。
甲のすべての乙について『』ことをそれぞれ繰り返す
パターン1:代入した場合の有効範囲
なんとかする手順
「手順内:[甲]」を報告する。
甲は,「丙」。
終わり
アレとは
はじめの手順
「はじめの手順内:[甲]」を報告する。
甲は,「丁」。
終わり
終わり
甲は,「乙」。
なんとかする。
甲を報告。
あれというアレを作る。
甲を報告。
結果:
手順内:乙
丙
はじめの手順内:丙
丁
プログラム全体で代入された変数は,手順内であっても種類内であっても読み込みと書き込みができました。
宣言していない変数を読み込むとどうなるでしょうか。
アレとは
はじめの手順
甲は,「乙」。
終わり
終わり
あというアレを作る。
甲を報告。
あの甲を報告。
乙
エラーにはなりません。値は空っぽです。
なんとかする手順
甲は,「乙」。
終わり
なんとかする。
甲を報告。
乙
このように,宣言されていない変数を読み込もうとすると,面倒なことになるので注意しましょう。
パターン2:【】を使って宣言
なんとかする手順
「手順内:[甲]」を報告する。
甲は,「丙」。
終わり
【甲】は,「乙」。
なんとかする。
アレとは
はじめの手順
「はじめの手順内:[甲]」を報告する。
甲は,「丁」。
終わり
終わり
【甲】は,「乙」。
あれというアレを作る。
甲を報告。
はじめの手順内:
乙
プログラム全体で【宣言】された変数は,種類から読み込めませんし,書き込めません。
パターン3:種類
種類では,他の場所と異なり,アクセス範囲を指定できる識別子がつけられます。
親とは
+甲
-乙
#丙
はじめの手順
甲は,1。
乙は,2。
丙は,3。
終わり
終わり
子とは
親を受け継ぐ
はじめの手順
「[甲],[乙],[丙]」を報告。
甲は,4。
’乙は,5。 ’エラー
丙は,6。
終わり
終わり
あという子を作る。
あの甲を報告
’あの乙を報告 ’エラー
’あの丙を報告 ’エラー
1,2,3
4
このように,-を付けた場合,継承した種類からも参照できません。#を付けた場合,プログラム全体からは参照できません。
アレとは
+甲
はじめの手順
甲は,1。
終わり
自分が[甲]を乙する手順
「種類手順内:[甲]と[自分の甲]」を報告。
甲は,3。
「種類手順内:[甲]と[自分の甲]」を報告。
自分の甲に1を足す。
「種類手順内:[甲]と[自分の甲]」を報告。
終わり
終わり
甲は,5。
あというアレを作る。
「あの甲:[あの甲]」を報告。
あが甲を乙する。
「あの甲:[あの甲]」を報告。
甲を報告。
あの甲:1
種類手順内:5と1
種類手順内:3と1
種類手順内:3と2
あの甲:2
5
種類内で定義した変数「+甲」と,手順の引数で定義した変数「[甲]」の名称が同じです。
この場合,単に「甲」としたものは引数の値を指し,読み込みも書き込みも行われます。
種類内で定義したものは,「自分の甲」とする必要があります。
パターン4:引数
[甲]を乙する手順
「手順内:[甲]」を報告。
甲に1を足す。
終わり
アレとは
はじめの手順
終わり
自分が[甲]を乙する手順
「種類内:[甲]」を報告。
甲に1を足す。
終わり
終わり
甲は,1。
甲を乙する。
甲を報告。
あというアレを作る。
あが甲を乙する。
甲を報告。
手順内:1
1
種類内:1
1
このように,手順の引数は手順内でのみ読み込み,書き込みができます。
パターン5:繰り返し
甲は,5。
5回甲にカウントしながら繰り返す
甲を報告。
繰り返し終わり
’エラー
’5回【甲】にカウントしながら繰り返す
’ 甲を報告。
’繰り返し終わり
1
2
3
4
5
繰り返す際に,カウンタ変数はリセットされるようです。また,既に宣言された変数を再度宣言しようとすると,エラーが出ました。
1回目の宣言に,繰り返し文で【】を使った場合でも同様です。