Table of Contents
昨日の動かなかった Lua API 関連のコードが動作した。
昨日、Nimで int
から csize_t
へ型変換する方法がわからなかったことを書いたが、cast
を使うと実現できることがわかった。具体的には以下のコードだ。
cast[csize_t](sizeof(int))
昨日のコードは最終的に以下のようになった。
『Writing a DSL in Lua』を読んだ
leafo.net (追記: 2021/08/12 2:00 URLの追加)
Lua でゲーム用スクリプト言語を作りたかった、というのが、Nim から Lua を操作したかったのは何故かという話の終着点だ。 この記事は itch.io (Steam のようなゲーム販売サイト。DDLC や Mindustry で使われている)や Moonscript(Lua でへコンパイルされる言語)の開発者の方が書かれた記事のようだ。
なんか某ノベルゲームブランドのロゴと瓜二つの葉っぱがサイトにありますね
この記事は Lua で HTML を生成する言語を作ることを目的とした記事だ。 これを読んで Lua という言語の凄さを感じた。 具体的には「Chaining」という章にあるので、是非読んでいただきたいのだが、Lua も DSL を作るにあたってベースにしやすそうな言語だと感じた。 読んでいて、幾つかつまづいた点があった。
まず 1 つ目にメタテーブルだ。 DSL を作成するにあたり、メタテーブルというものを活用する。 Lua でオブジェクト指向プログラミングをするには、基本的にテーブルという型にそれぞれメソッドをぶら下げる形でクラスを作る。しかし、実装の中身が同じであっても、Lua 側では別物と認識されてしまう。そこで、登場するのがメタテーブルという概念である。 メタテーブルに関しては以下の記事が参考になった。hevohevo.hatenablog.com
次に、Lua 5.1 までは存在したsetfenv という関数を自力で実装する記事を見なければ、この DSL 処理系は完成しない。そこで使われるのが debug.upvaluejoin
や、
debug.getupvalue
という標準関数である。これらの標準関数が何をやっているのかが、よくわからなかった。
そこで、この記事を参考に理解しようと試みた。
Lua 5.3 では
print("Hello, World")
というコードが Lua の内部的には
(function() local _ENV = <グローバル変数に相当するテーブル> return function(...) print("Hello world!") -- この print は _ENV.print と等価 end end)()
のように評価されているらしい。 それで、先程の関数はグローバル変数を操作しているらしい。
今度は最初の記事を自分で和訳しながら理解できるといいな、と思った。
ZIMA がうまい
親と酒を飲むことが最近多いのだが、今日飲んだベトナム産の酒 ZIMA がおいしかった。
今日の曲
土岐麻子さんが参加していた、Cymbals という(もう解散してしまった)バンドもいいので是非。