阅读lmathlib.c

来源:互联网 发布:征兵心理测试软件 编辑:程序博客网 时间:2024/05/15 01:11

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;}


0 0
原创粉丝点击