2021/08/11

Table of Contents

  1. 昨日の動かなかった Lua API 関連のコードが動作した。
  2. 『Writing a DSL in Lua』を読んだ
  3. ZIMA がうまい
  4. 今日の曲
  5. 参考

昨日の動かなかった Lua API 関連のコードが動作した。

昨日、Nimで int から csize_t へ型変換する方法がわからなかったことを書いたが、castを使うと実現できることがわかった。具体的には以下のコードだ。

cast[csize_t](sizeof(int))

昨日のコードは最終的に以下のようになった。

gitlab.com

『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」という章にあるので、是非読んでいただきたいのだが、LuaDSL を作るにあたってベースにしやすそうな言語だと感じた。 読んでいて、幾つかつまづいた点があった。

まず 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 という(もう解散してしまった)バンドもいいので是非。

参考