The Dormouse
/* placeholders */
{"pi", NULL},
{"huge", NULL},
{"maxinteger", NULL},
{"mininteger", NULL},
{NULL, NULL}
};
/*
** Open math library
*/
LUAMOD_API int luaopen_math (lua_State *L) {
luaL_newlib(L, mathlib);
lua_pushnumber(L, PI);
lua_setfield(L, -2, "pi");
lua_pushnumber(L, (lua_Number)HUGE_VAL);
lua_setfield(L, -2, "huge");
lua_pushinteger(L, LUA_MAXINTEGER);
lua_setfield(L, -2, "maxinteger");
lua_pushinteger(L, LUA_MININTEGER);
lua_setfield(L, -2, "mininteger");
return 1;
}
Забавно.
// Не люблю setfield, дёргает метаметоды
#define luax_tsfunction(L, name, func) lua_pushstring(L, name); lua_pushcfunction(L, func); lua_rawset(L, -3)
#define luax_tnnumber(L, index, value) lua_pushnumber(L, index); lua_pushnumber(L, value); lua_rawset(L, -3)
#define luax_tsnumber(L, name, value) lua_pushstring(L, name); lua_pushnumber(L, value); lua_rawset(L, -3)
int luaopen_math (lua_State *L) {
luaL_newtable(L);
luax_tsfunction(L, "dir", luamath_dir);
luax_tsnumber(L, "pi", PI);
luax_tsnumber(L, "huge", HUGE_VAL);
return 1;
}
Мне нравятся подобные варианты тем, что тут полный контроль над либой.