// gcc a.c -llua5.1
#include <lua5.1/lua.h>
#include <lua5.1/lualib.h>
#include <lua5.1/lauxlib.h>
int l_map(lua_State *L)
{
int i, n;
//第一个元素必须是table
luaL_checktype(L, 1, LUA_TTABLE);
//第二个元素必须为函数
luaL_checktype(L, 2, LUA_TFUNCTION);
//获取table的大小
n = lua_objlen(L, 1);
/*
* 从table中得到相应下标的元素
lua_rawgeti(L, index, key)
index表示table在栈中的位置
key表示元素在table中的位置
* */
/*
* 把值放到table相应下标位置
lua_rawseti(L, index, key)
index表示table在栈中的位置
key表示元素在table中的位置
* */
for (i = 1; i <= n; i++)
{
lua_pushvalue(L, 2);// 压入 f
lua_rawgeti(L, 1, i);//压入t[i]
lua_call(L, 1, 1);//调用f(t[i])
printf("lua data = %g\n", lua_tonumber(L, -1));
lua_rawseti(L, 1, i);// t[i] = 结果
}
printf("stack size = %d\n", lua_gettop(L));
for (int i = 1; i <= n; i++)
{
lua_rawgeti(L, 1, i);//压入t[i]
printf("lua data = %g\n", lua_tonumber(L, -1));
}
return 0;
}
int main()
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);
lua_pushcfunction(L, l_map);
lua_setglobal(L, "map");
const char *fname = "a.lua";
luaL_loadfile(L, fname);
lua_pcall(L, 0, 0, 0);
lua_close(L);
return 0;
}
--a.lua
function f(a)
return 2*a
end
tab = {1, 2, 3, 4, 5}
map(tab, f)