ローカルスコープについて

luaの挙動の話は前回でおしまいの予定だったが、補足が2件ほどあった。ひとつめがローカルスコープと関数の扱い。

local 宣言について先週は「そこで新たにローカルスコープを作る」というタイプの表現をしたが、どちらかというと、「ある種の操作では自動的にローカルスコープが作られる」「local宣言でローカルスコープに変数を追加する」とする方がより素直な理解なのかも(実装はこれから)。

具体的な「ローカルスコープを積むもの」は、

  • do 〜 end
  • 関数

ところで、「local宣言されない初出の変数は自動的にグローバルな領域の変数とみなす」という限定がある。このため、たとえば、

function acm()
  x = 0
  return(function () x = x + 1; return x; end)
end  

のようにアキュムレータを作ると、

inc = acm()
print(inc())  ---> 0
print(inc())  ---> 1
x = 10
print(inc())  ---> 11

のようになる。これを避けるには明示的に local 宣言をする。

function acm()
  local x = 0
  return(function () x = x + 1; return x; end, function () x = x - 1; return x; end)
end