Luaを使ってみる - arosh/arosh.github.com GitHub Wiki
環境: Ubuntu14.04(amd64), Lua5.2
sudo apt-get install liblua5.2-dev
- Lua 5.2 Reference Manual
- 良いもの。悪いもの。 Lua基礎文法最速マスター - いつものアレ
- ドットインストール Lua入門 - 参考リンク一覧も便利
- lua-users wiki: Lua Faq
// 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.h
、lualib.h
、lauxlib.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はWikiで無数に列挙されているが、Ubuntuの標準リポジトリでは以下のものしか見つからなかった(簡単にしか探していないので,ちゃんと探せば見つかるかもしれない).
- luabind
- tolua
- tolua++