Lua から C の関数をコールする - C に Lua を組み込む

Lua側から呼び出す関数名と呼び出される関数を lua_regster() で登録する。
すると、登録した名前で Lua から呼び出せるようになります。

今回は、Lua から受け取った引数の数とそれぞれの型を出力しています。
スタック操作のインデックスは 1 からなので注意。

ソースコード

#include <stdio.h>
#include <stdlib.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

int lua_argument_type(lua_State *L);

int main (int argc, char *argv[])
{
    lua_State *L;

    if (argc < 2) {
        fprintf(stderr, "usage: %s filename\n", argv[0]);
        exit(1);
    }

    L = luaL_newstate();

    luaL_openlibs(L);

    // Lua側から呼び出す関数名と呼び出される関数を登録する。
    lua_register(L, "argument_type", lua_argument_type);

    if (luaL_dofile(L, argv[1])) {
        fprintf(stderr, "error: %s\n", lua_tostring(L, -1));
        lua_close(L);
        exit(1);
    }

    lua_close(L);

    exit(0);
}
	
int lua_argument_type(lua_State *L)
{
    int n, i, type;

    // 引数の数(スタックにある要素の数)を取得する
    n = lua_gettop(L);

    printf("number of arguments: %d\n", n);

    for (i = 0; i < n; i++) {
        // インデックスの開始は 1 から
        type = lua_type(L, i + 1);
        printf("  %d) %s(%d)\n", i + 1, lua_typename(L, type), type);
    }

    return 0;
}

Lua コード

t = {};

function foo (x, y)
  return  x + y;
end

argument_type("a", false, 20, t, nil, foo);

実行結果

number of arguments: 6
  1) string(4)
  2) boolean(1)
  3) number(3)
  4) table(5)
  5) nil(0)
  6) function(6)