Luaを使ってみる - arosh/arosh.github.com GitHub Wiki

環境: Ubuntu14.04(amd64), Lua5.2

準備

sudo apt-get install liblua5.2-dev

重要な情報源

まずはHelloWorld

// hello.cpp
#include <iostream>
#include <lua5.2/lua.hpp>

int main() {
  lua_State *L = luaL_newstate();
  luaL_openlibs(L);
  int err = luaL_dofile(L, "hello.lua");
  if(err) {
    const char *lua_message = lua_tostring(L, -1);
    std::cerr << "[Lua] " << lua_message << std::endl;
  }
}
-- hello.lua
print("Hello, world!")
# Makefile
CXXFLAGS=-DLUA_USE_APICHECK -std=c++11 -Wall -Wextra -g
LDLIBS=-llua5.2
  • lua.hppの実態はlua.hlualib.hlauxlib.hをincludeしているだけ。
  • lua_close(L);無くてもだいたいOK
  • LUA_USE_APICHECKを付けるとスタックのインデックスのチェックをしてくれる
  • luaL_で始まる関数はauxiliary libraryと呼ばれているもので、lauxlib.hをincludeすると使える高レベルな関数群である。lua_で始まっているものよりも、こちらを優先して使うほうが良い。
    • lua_tostringの代わりにluaL_checkstringを使ったり、lua_tonumberの代わりにlua_checkintを使ったりしたほうが良いだろう。
    • luaL_tolstringを使ったらdump_stackの実装が簡単になりそうな気もする。

スタックの表示

車輪の再発明感が半端無いが、一応実装してみた。

void dump_stack(lua_State *L) {
  using std::cerr;
  using std::endl;

  cerr << "[Lua]" << endl;;
  int size = lua_gettop(L);
  for(int i = size; i >= 1; --i) {
    cerr << "[" << i << "] ";

    int type = lua_type(L, i);
    switch(type) {
      case LUA_TBOOLEAN:
        cerr << (lua_toboolean(L, i) ? "true" : "false");
        break;

      case LUA_TNUMBER:
        cerr << lua_tonumber(L, i);
        break;

      case LUA_TSTRING:
        cerr << "\"" << lua_tostring(L, i) << "\"";
        break;

      case LUA_TNIL:
        cerr << "nil";
        break;
    }

    cerr << endl;
  }
}

おまじない

Luaは存在していない変数へのアクセスがあったとき、その変数をグローバル変数として扱うので、そのまま使うと闇不可避。

require("strict")を先頭で宣言しておくのが良いだろう。

参考: 「SDL + OpenGL でゲームプログラム」講座 Luaスクリプトの実行

LuaのBinding

LuaのBindingはWikiで無数に列挙されているが、Ubuntuの標準リポジトリでは以下のものしか見つからなかった(簡単にしか探していないので,ちゃんと探せば見つかるかもしれない).

  • luabind
  • tolua
  • tolua++
⚠️ **GitHub.com Fallback** ⚠️