プログラミング

LuaとC言語との連携

LuaとC言語との連携は癖があります。Cライブラリ側にLua専用のコードを記述する必要がありますので,既存のライブラリをそのまま使うという使い方は難しいかもしれません。特にデータの受け渡しは低レベルで,スタックにプッシュしたりポップしたりする手続きを記述する必要があります。

#!/bin/bash

gcc --shared -fPIC -o libadd.so -xc - << EOS
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
static int c_add(lua_State *L)
{
    lua_pushnumber(L, (luaL_checknumber(L, 1) + luaL_checknumber(L, 2)));
    return 1;
}
int luaopen_libadd(lua_State *L)
{
    lua_register(L, "add", c_add);
    return 0;
}
EOS
if [ ! $? -eq 0 ]; then echo "ERROR" && exit 1; fi

cat << EOF > lua2c.lua
require "libadd"
for i = 1, 10 do
  print(tostring(i) .. " + " .. tostring(10 * i) .." = " .. tostring(add(i,i * 10)))
end
EOF

lua lua2c.lua