2.8 変数のスコープ
問 2.23
以下の2つの宣言列を考える.
宣言列(1)
val x = 1
val y = 2
val x = x * 2 + y
val y = x + y * 2;
宣言列(2)
val x = 1
val y = 2
val x = x * 2 + y
and y = x + y * 2;
これら各宣言列の後の x と y の値は何か.
解答例 それぞれ、問題の趣旨は、実行して確認することではないが、SML#で実 行すると、以下のようになる。
# val x = 1 > val y = 2 > val x = x * 2 + y > val y = x + y * 2; val x = 4 : int val y = 8 : int # val x = 1 > val y = 2 > val x = x * 2 + y > and y = x + y * 2; > ; val x = 4 : int val y = 5 : int
問 2.24
以下のプログラムで宣言される各変数のスコープを示せ.
fun f (x,y) = let fun f x = x + y; in x + f y end; f (2,3);
このプログラムの評価結果は何か?
解答例 各変数のスコープは以下の通り。
-
•
外側のf : f (2,3);
-
•
外側のx : in x + f y end
-
•
外側のy : x + y; in x + f y end;
-
•
内側のf : x + y; in x + f y end;
-
•
内側のx : x + y
2 + (3 + 3)が計算され、SML#で実行すると、 val it = 8 : intと表示されるはずである。
問 2.25
静的スコープ規則に対して,動的なスコープ規則に基づいた変数の評価も 可能である. 動的なスコープ規則では,変数の値は,それが実際に評価された時点での 環境でその変数に束縛された値である.
入れ子になった関数定義を含む以下の式を考える.
let fun f x = let fun g y = x + y fun h x = g (x * 3) in h (x + 3) end in f 10 end
この式をMLで評価した時と動的スコープ規則で評価したときの結果はそれぞれ何か?
解答例 静的スコープ規則を持つMLの場合、関数gのコードx+yのx は、fの引数と同じ10であり、結果は49となる。
一方、動的スコープ規則を持つ言語の評価は、関数gのコードx+yのxは、 呼ばれた時点での環境に記述されたxの値であり、以下のように評価され、
環境 式 {} f 10 {x:10} h (x + 3) {x:10} h 13) {x:13} g (x * 3)) {x:13} g 39 {x:13, y:39} x + y {x:13, y:39} 52
結果は52となる。