您的位置:首页 > 其它

阅读lmathlib.c

2016-02-17 19:30 357 查看
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;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: