スコープとか

globalなlocal変数は分かりにくいのでstatic変数と呼ぶことにする。

関数に渡せるstatic変数はLuaでは内部で使われている変数が自動的に上位値で渡されているので上限とかがあったりする。
つまり決められた個数以上のstatic変数は渡せないというか使えない。
上限を超えて参照すると上限超えましたってエラーが出る。
純粋なglobal変数は、GLOBALテーブルが一緒に渡されているので
それはいくらでも参照できるし明示しなくても参照可能。

static変数は関数の後ろに:()で使用するリストを渡さないとエラーになる。
個数の上限は不明。Cから呼ぶときは普通に自前でstackに積む必要があるかも。
関数内で暗黙で参照できるglobal変数はrootテーブルに明示的にセットしたものしか参照できない模様。
で、rootテーブルにどうやって登録するかというと

Expressions
Assignment(=) & new slot(<-)

globalなスコープで(<-)を使って値を設定すると、それがrootテーブルに設定されるようだ。
それ以外はrootテーブルと同じレベルで配置?されちゃうから参照不可と。
いう解釈であってるのでしょうか。


typoで変数が勝手に作られないようにするための配慮らしい。
あり難いんだけど迷惑?

local t = {}

-- 無い変数はnilになる.
if ( t.a == nil ) then
    print("t.a == nil\n")
end

-- ここで初めて実体が作られる.
t.a = 0
local t = {}

// 無い変数はnullになる?.
if ( t.a == null ){
    print("t.a == nil\n");
}

// エラー.
t.a = 0;

// OK
t.a <- 0;


なんか自由度が下がってますね。
typoはバグの原因第1位なんだけどもそれだけ依存した書き方になってるとも言えるので微妙。
globalでは"local"で変数を作るか、"<-"でrootに設定するかしないとエラーになるっぽい。
"="はすでに存在している変数のみに使えると、そういうことか。


明示的にdelete出来るのは面白いかなと思ったけどLuaでもtable.removeとかで同じようなことやってたね。別段面白いことでもないね。