標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

Lua 5.4 のバイナリが出てた!

いきなり丸投げの関連リンク

Lua 5.4 の目玉は to-be-closed variable だと思うんだけど、lua.org の説明 見ても、書き方がさっぱり分からない (そもそもサンプルコードもないぞ)。

上記の日本語の解説ページを見てやっと分かった。こんな感じでいいらしい

function new()
    return setmetatable({},{
        __close = function(this) print("__closed called") end ,
        __gc = function(this) print("__gc called") end }
    )
end
do
    local x<close> = new()
    print("Block ends")
end
print("Program terminated")
$ lua54 foo.lua
Block ends
__closed called
Program terminated
__gc called

<close> という修飾子を変数の後につけると、その「変数」の有効範囲を抜けた時に、メタテーブルの __close に登録されたメソッドが呼び出されるらしい。 これはリソースの後片付けに便利! (Lua から COM オブジェクトを呼ぶ時、後片付けに Release というメソッドをいちいち呼ばなくてはいけなかったんよ)

だけど、なんでパーサーが大変な <close> なんて表現にしたかなぁ。local x<close>= ではなく、 using x = みたいな方が楽だと思うんだけど。謎だ


Dependency Walker で依存ファイルを確認した。

lua54.dll は MSVCRT.dll にしか依存していない。

f:id:zetamatta:20200725173927p:plain

lua54.exe も lua54.dll と MSVCRT.dll にしか依存していない。

f:id:zetamatta:20200725174022p:plain

普通に MinGW/gcc でビルドすると、DLL が MinGW のランタイムを必要としてしまうが、そうなっていないところを見るとまた古めの MinGW でビルドしてるのかな?