Cmm のスコープルールは、実行時スコープです。そのため、関数実行時にシン ボルの定義が解決できていれば、再帰呼びだしなどで起こる前方参照の未定義 エラーは起こりません。
func b (n) {
if (n < 0)
return ;
a (n-1); // bの定義時点では、aは未定義。コンパイラ言語ならここでエラー
}
b(5) // この呼びだしは、この時点 a が定義されていないのでエラー
func a (n) {
println (n) ;
b(n) ;
}
a (10); // この時点で a, b どちらも定義済みなのでエラーは発生しない
また、下記の例のように、関数中に定義されたローカル変数で、変数が解決さ れても問題ありません。
func FuncA () {
// FuncA定義場所より前に、変数aVariableは定義されていない。
if (is_integer(aVariable)) {
println ("This is Integer") ;
} else {
println ("This is NOT Integer") ;
}
}
func VariableProvider () {
var aVariable ; // ここで aVariable が定義された
aVariable = 10 ;
// このFuncA()呼びだしでは、この関数で定義したaVariableが参照される
FuncA() ;
}
VariableProvider() ;
// ここでは、変数aVariableが定義されていないのでエラーとなる
FuncA ()