GitHub - wxLuaApp の件。実用アプリが開発できるかどうか、試してみた。こんな感じです。見る人が見れば、何を作ってるかわかると思う。
本気でアプリを作り始めると、wxLua の未完成なところがいろいろ見えてきた。公式の開発チームは開店休業状態で、ゲリラ的に開発されている状態だからなあ。
- wxWidgets 3.0.x で一応ビルドできるのだが、これだと 3.0 以降の機能が使えないことがある。コンパイルの条件が
wxCHECK_VERSION(3,1,1)
で書かれているため。いったん一括変換でwxCHECK_VERSION(3,0,0)
に変えたあと、3.0 でコンパイルエラーを起こすところを手動で修正した。 wxPoint
はx, y
をフィールドのようにアクセスできるのだが、wxSize
やwxRect
は関数を使わないとメンバにアクセスできない。
これらのクラスはpt = wx.wxPoint(2, 3); print(pt.x) -- "2" sz = wx.wxSize(2, 3); print(sz.width) -- エラー rc = wx.wxRect(2, 3, 10, 20); print(rc.x) -- エラー print(sx:GetWidth(), rc:GetX()) -- どちらも OK
wxcore_gdi.cpp
で定義されている。上記の不統一は、別に本質的な理由があるわけではなくて、単に実装されていないだけだった。wx.wxPoint
じゃなくてwx.Point
でよかったんじゃないの?と思うのだが、これは今さら変えられないかな。wx.wxBLACK_PEN
はあるけどwx.wxBLUE_PEN
はないとか、他にも不統一はいろいろありそう。wx.wx****
クラスのオブジェクトにフィールドを追加する(インスタンス変数みたいなもの)ことはできるけど、nil
が入れられない。
これは Lua のメタテーブルの仕様なのかな。sz = wx.wxSize(2, 3) sz.field = 1; print(sz.field) -- "1" sz.field = nil; print(sz.field) -- "Unable to call an unknown method 'field' on a 'wxSize' type.
false
か何かで代用するしかないか。
いろいろ不十分ではあるけど、悪くないですよ。Mac ではアプリ本体が 25 MB ぐらいで、あとはスクリプトとアイコンの画像ファイルだけ。LuaJIT なので、いざとなったら C のライブラリ関数を呼べる。上で試作中のアプリでも、バイナリファイルを読むために memmove()
などを使ったりしている。