プログラミング言語 Standard ML 入門 (問題の解答例)
2 関数を用いたプログラミング

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;
これら各宣言列の後の xy の値は何か.

解答例  それぞれ、問題の趣旨は、実行して確認することではないが、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+yx は、fの引数と同じ10であり、結果は49となる。

一方、動的スコープ規則を持つ言語の評価は、関数gのコードx+yxは、 呼ばれた時点での環境に記述された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となる。