変数のスコープ
変数の作成時、現在のコンテキストがスコープとなります。つまり、現在のスコープ、またはそれよりも広範囲にあるものは可視状態となります。スコープの最大範囲はモジュールです。
Dim newVar = 12
以下のスコープはルーチンです。
Function myRoutine()
Dim newVar = 12
End Function
sdlBasic はルーチンの内側で変数を検出したとき、ルーチンに関する変数のスコープで同名変数の有無を確認後に使用します。
Dim myVar = "module variable" ' これはモジュールレベルで宣言されます
Function myRoutine()
Dim myVar = "routine variable" ' これはルーチンレベルで宣言されます
myVar = "new value" ' ルーチン版のローカル myVar を使用
return myVar
End Function
print myRoutine()
print myVar
そうでない場合は、モジュール変数の有無を確認後に使用します。
Dim myVar = "module variable" ' これはモジュールレベルで宣言されます
Function myRoutine()
myVar = "new value" ' モジュール版の myVar を使用
return myVar
End Function
print myRoutine()
print myVar
ルーチン、またはモジュール版の変数がなければ、現在のスコープに変数を作成します。
Function myRoutine()
myVar = "new value" ' ルーチンのスコープ内に変数を作成
End Function
ルーチンのスコープにある変数はルーチンの内側に限り可視状態となるため、このようなスコープとなります。
Function myRoutine()
myVar = 12
print myVar ' こちらの myVar は可視状態です
End Function
myRoutine()
print myVar ' こちらの myVar は不可視状態です
sdlBasic による変数の作成を禁止するには Option Explicit ステートメントを使います。
Option Explicit の指定後は変数の使用前に宣言する必要があります。
Option Explicit
Dim newVar = "作成してください"
Option Explicit の指定時、 Shared キーワードにより明確な可視状態で宣言、あるいは Common (または Global) で宣言していなければ、モジュールレベルの変数はルーチンから不可視状態になります。
Option Explicit
Dim myVar = "モジュールの変数"
Function myFunction()
Shared myVar
myVar = "新しい値"
End Function
または:
Option Explicit
Dim Common myVar = "モジュールの変数"
Function myFunction()
myVar = "新しい値"
End Function