たいへん久しぶりに、LuaAppMaker を立ち上げて、コーディングしてみた。以前に wxPython で書いてみたアプリの Lua 版です。
まだ wxPython で実現できていた機能を全部は再現できてない。一応 Python 版のソースコードを忠実に移植しているつもりではあるんだけど。Python と比べてやっぱり Lua は言語としては非力だな、と思う。特にイテレータ系にそれを感じる。
# Python
segments = self.ClipLine(p1, p2, None, (bonds[i].bounds for i in blist))
-- Lua
-- table.collect は自分で書いた
local bbounds = table.collect(blist, function (i) return bonds[i].bounds end)
segments = self:ClipLine(p1, p2, segments, bbounds)
でも、そのぶん処理系は軽いからね。ほぼフルセットの wxWidgets をサポートして 20 MB ぐらいだからね。wxPython でコードを書くのはなかなかの快感だったけど、wxLua もあまり負けてはいない。
今回は少し頑張って、ZeroBrane Studio でのデバッグをだいぶ充実させた。ランタイムエラーが出た時、その時点でデバッガに制御を移して、スタックフレーム中の式を評価できるようにした。下の図で、赤で囲んだ位置でランタイムエラーが出ています。エラーハンドラから debug.traceback
関数が呼ばれるのだが、それにフックをかけて、デバッガで止められるようにしている。
独自拡張だけど、Remote Console の画面で、@3 event:GetEventObject()
と入れると、3番目のスタックフレーム(ランタイムエラーが出たフレーム)の環境で式を評価できる。この機能が実装できたのは大きい。今まで、ランタイムエラーで止まってしまうと、その時点での変数の値は推測するしかなかったからな。
アプリの開発はなかなか進まないと思うけど、気長にやるつもりです。