Lua

Lua 学习

Lua 学习

Posted by Deetch on September 11, 2017

“Let’s go”

头文件

lua.h:定义了Lua提供的基础函数,都有一个lua_前缀

lauxlib.h:定义了辅助库(auxlib)提供的函数。都有一个luaL_打头。辅助库利用lua.h中提供的基础函数提供了更高层次上
的抽象;所有Lua标准库都使用了auxlib

lualib.h:为了保持Lua的苗条,所有的标准库以单独的包提供,所以如果你不需要就不会强求你使用它们。该头文件定义了打
开这些库的函数。

C接口

常用接口

lua_State* lua_open();

luaopen_base(lua_State*); //deprecate

luaopen_table(lua_State*); //deprecate

luaopen_io(lua_State*); //deprecate

luaopen_string(lua_State*); //deprecate

luaopen_math(lua_State*); //deprecate

luaL_openlibs(lua_State*)

luaL_loadbuffer()

lua_close(lua_State*)

压入元素

void lua_pushnil(lua_State*);

void lua_pushboolean(lua_State*, int bool);

void lua_pushnumber(lua_State*, double n);

void lua_pushlstring(lua_State*, const char *s, size_t length);

void lua_pushstring(lua_State*, const char *s);

int lua_checkstack(lua_State*, int sz)

查询元素

int lua_is(lua_State, int index):*可以是任何Lua类型。因此number, string, table等。该函数不检查这个值
是否是指定的类型,而是看它是否能被转换成指定的那种类型。例如,任何数字
类型都满足lua_isstring

lua_type():返回栈中元素的类型,在lua.h头文件中,每种类型都被定义为一个常量:LUA_TNIL,LUA_TBOOLEAN,LUA_TNUMBER
,LUA_STRING,LUA_TTABLE,LUA_TFUNCTION,LUA_TUSERDATA,LUA_TTHREAD

lua_typename(L, t):转换一个类型码到类型名

int lua_toboolean(lua_State*, int index);

double lua_tonumber(lua_State*, int index);

const char * lua_tostring(lua_State*, int index);

size_t lua_strlen(lua_State*, int index);

即使给定的元素类型不正确,调用上面这些函数也没有什么问题,在这种情况下,lua_toboolean,lua_tonumber和lua_strlen
返回0,其他函数返回NULL。由于ANSI C没有提供有效的可以用来判断村无发生数字值,所以返回的0是没有什么用处的。

lua_string返回的字符串结尾总会有一个字符结束标志0,但是字符串中间也能包含0,lua_strlen返回字符串的实际长度。
特殊情况下,假定栈顶的值是一个字符串,下面的断言总是有效的
const char *s = lua_tostring(L, -1);
size_t l = lua_strlen(L, -1);
assert(s[l] == '\0');
assert(strlen(s) <= 1)

其他堆栈操作

int lua_gettop(lua_State*);
返回堆栈中的元素个数,它也是栈顶元素的索引。注意一个负数索引-x对应于正数索引gettop - x + 1

void lua_settop(lua_State*, index);
设置栈顶为一个指定的值。如果开始的栈顶高于新的栈顶,顶部的值被丢弃。否则,为了得到指定的大小这个函数压入相应
个数的控制(nil)到栈上。lua_settop(L, 0)清空堆栈。
#define lua_pop(L, n) lua_settop(L, -(n) - 1)

void lua_pushvalue(lua_State*, index);
压入堆栈上指定索引的一个拷贝到栈顶

void lua_remove(lua_State*, index);
移除指定索引位置的元素,并将其上面所有的元素下移来填补这个位置的空白

void lua_insert(lua_State*, index);
移动栈顶元素到指定索引的位置,并将这个索引位置上面的元素全部上移至栈顶被移动留下的空隔

void lua_replace(lua_State*, index);
从栈顶弹出元素值并将其设置到指定索引位置,没有任何移动操作

帮助函数,dump整个堆栈内容:
static void stackDump(lua_State *L)
{
  int i;
  int top = lua_gettop(L);
  for(i = 1; i <= top; i++)
  {
    int t = lua_type(L, i);
    switch(t)
    {
      case LUA_TSTRING:
        printf("`%s'", lua_tostring(L, i));
        break;
        
      case LUA_TBOOLEAN:
        printf(lua_toboolean(L, i) ? "true" : "false");
        break;
        
      case LUA_TNUMBER:
        printf("%g", lua_tonumber(L, i));
        break;
        
      default:
        printf("%s", lua_typename(L, t));
        break;
    }
    printf("  ");
  }
  printf("\n");
}

规则

当C函数接受一个来自lua的字符串作为参数时,两个规则必须遵守:当字符串正在被访问的时候不要将其出栈;永远不要修改字符串

参考

c语言setjmp

c语言longjmp