なんか色々疑問が出てきた。

動きの部分で幾つか疑問点とかが出てきました。取りあえず大きいのを2つ。

コードブロックのお話

{
  int a = 1;
  {
    a = 2;
    cout<<a<<endl; //2
  }
  cout<<a<<endl; //1
}

{
  int a = 1;
  {
    int a = 2;
    cout<<a<<endl; //2
  }
  cout<<a<<endl; //1
}

うーむむ。この辺てなんでこういう風になっているんだろう。
確かにセマンティクス的にはそうなのかもしれないけども、もうちょっと言語論的な所から説明が欲しいというか本読んでみたい。

型が無い場合でのグローバルとかその辺

i = 100

def a()
  i = 1
  b()
  puts i
end

def b()
  i = 2
  puts i
end

def main()
  a()
  puts i
end

main()

これはどうなるのかなーと思って動かしてみるとエラーを喰らいました。
rubyではglobal変数には$記号を使ってやる必要があるのですね。
今までなんでわざわざと思ってたけどこうやって詰まって色々いじっていると成る程なーとか思う所が色々あるわけでふ。


少なくとも変数のassignmentを行う際にはフレームを辿るにしても優先順位がやっぱりあるんですかな(??)


関数は基本的に局所フレーム(引数とローカル変数)と大域フレームとクロージャと照らし合わせてrefとassignをやれば良いのかしら?


後問題なのは、PCASTLにはグローバル変数を特別視するだとかその辺を入れたくない(面倒くさいのと気持ち悪くなりそう)なので、上記の様な場合だとどうすれば良いのかしらーとか思っちゃうわけです。


それこそ

a = 0
print(a) -> 0
{
  a = 1
  print(a) -> 1
  {
    a = 2
    print(a) -> 2
  }
  print(a) -> 1
}
print(a) -> 0

の方が自然なんじゃないかなーとは思いますね。


参考に出来る様な本があれば教えてもらえるとありがたいです。SICPに載ってる気もする。

当たり前の事が分かっとらん。
メモ:SICP,Modern Compiler Implementation in (C|ML),TaPL