1. 重要的结构 luaL_Reg
typedef struct luaL_Reg {
const char *name;
lua_CFunction func;
} luaL_Reg;
typedef int (*lua_CFunction) (lua_State *L);
可以用该结构做参数简单的来创建table
luaL_newlib(L, mathlib);
这样在栈顶创建了一个table,并且table各个域(主要是各种方法 c closure, 注意是没有upvalue)
math lib里面还添加了几个常量,赋值
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");
放一个值到栈顶,然后设置给刚刚创建的这个table。
2. RANDOM 能够处理0-2个参数
lua_gettop()检测参数数量
luaL_checkinteger(L, 1); 这个函数用来检查栈上的参数是否是int值,并返回
; 这个顺序是从上到下(我的理解)
lua_pushinteger(L, (lua_Integer)r + low); 将结果放回栈里
return 1; 表示返回一个值,注意一定要将栈对齐。
static int math_random (lua_State *L) {
lua_Integer low, up;
double r = (double)l_rand() * (1.0 / ((double)L_RANDMAX + 1.0));
switch (lua_gettop(L)) { /* check number of arguments */
case 0: { /* no arguments */
lua_pushnumber(L, (lua_Number)r); /* Number between 0 and 1 */
return 1;
}
case 1: { /* only upper limit */
low = 1;
up = luaL_checkinteger(L, 1);
break;
}
case 2: { /* lower and upper limits */
low = luaL_checkinteger(L, 1);
up = luaL_checkinteger(L, 2);
break;
}
default: return luaL_error(L, "wrong number of arguments");
}
/* random integer in the interval [low, up] */
luaL_argcheck(L, low <= up, 1, "interval is empty");
luaL_argcheck(L, low >= 0 || up <= LUA_MAXINTEGER + low, 1,
"interval too large");
r *= (double)(up - low) + 1.0;
lua_pushinteger(L, (lua_Integer)r + low);
return 1;
}