俺言語とクロージャ

ケース1:

fun main()
{
  var f;
  m = 1;
  {
    var m = 2;
    f = fun() {
      print( m);
      var m = 3;  // このmは無名関数のローカル変数
      print( m);
    };
  }
  f();       // => 2, 3
  print(m);  // => 1
}


ケース2:

fun main()
{
  var f;
  var m = 1;
  {
    f = fun() { print( m); };
    var m = 2;  // このmは無名関数と同じスコープ
  }
  f(); // => 2
}


ケース1は予想通りの挙動だけど,2が気持ち悪い.fに無名関数を代入している時点では,関数の中身を評価していないので,mが同じスコープに存在していないことを知らない.