这篇为学习lua杂记。
一、关于lua源码的一些文件:
1.lua.c —— lua解释器程序源码。
2.lua.h —— 该头文件定义了Lua提供的基础函数,包括创建Lua环境,调用Lua函数(如 lua_pcall)、读写Lua环境中全局变量,
以及注册供Lua调用的新函数等。该头文件定义所有内容都有一个“lua_”前缀。
3.luaxlib.h —— 该头文件定义了Lua辅助库提供的函数。他的所有定义都以“luaL_”为前缀(如 luaL_loadbuffer)。辅助库是一个
使用lua.h中的API编写出来的一个较高的抽象层。注:辅助库没有直接访问Lua内部,它都是官方的基础API来完成
所有工作的。
二、关于lua的一些函数:
1.luaL_newstate() —— 创建一个新的Lua环境(或状态)。当创建一个新的环境时,该环境为空,新环境中没有包含预定义的函数。
为了使Lua保持小巧,所有标准库都被组织到了不同的包中。在lualib.h中定义了打开这些库的函数。
2.luaL_openlibs (lua_State *L) —— 该函数可以打开所有的标准库。
3.luaL_loadbuffer(L,s,sz,n) —— 编译加载到Lua环境中的命令。如果没有错误,此函数返回0,并想栈中压入编译后的程序块。
4.lua_pcall(L,n,r,f) —— 通过调用此函数,将luaL_loadbuffer()压入栈中的程序块弹出,并在保护模式中运行它。与luaL_loadbuffer
一样,该函数返回0表示没有错误。如果发生错误,那么这些函数就会向栈中压入一条错误消息。
5.lua_tostring(L,i) —— 用该函数可以获取lua_pcall调用的函数错误时向栈中压入的一条错误信息。打印后,
可以用lua_pop()把它从栈中删除。
三、关于栈的一些基础理解:
一、关于对栈操作的一些函数:
①.压栈操作函数
1.void lua_pushnil (lua_State *L) —— 向栈中压入常量nil值。
2.lua_pushnumber(lua_State *L) ——向栈中压入双精度浮点数。
3.lua_pushinteger(lua_State *L) —— 向栈中压入整型数。
4.lua_pushboolean(lua_State *L) —— 向栈中压入bool变量(C语言中用整数)。
5.lua_pushlstring(lua_State *L) —— 向栈中压入字符串(char * 及长度)。
6.lua_pushstring(lua_State *L) —— 向栈中压入以字符零结尾的字符串。
7.int lua_checkstack(lua_State *L, int sz) —— 检查栈是否够用。
③.查询栈中元素
在Lua通讯中,向栈查询元素是通过索引(index),正索引是从第一个压入参数开始,负索引是从最后一个
压入参数开始。
1. int lua_is*(lua_State *L, int index) —— 此类函数是查询栈中元素是否是查询的类型。
需要注意的是:lua_isnumber不会检查值是否是数字类型,而是检查值是否能转换为数字类型,lua_isstring也具有
同样的行为。因此,对于任何数字,lua_isstring都返回真。
2.int lua_type (lua_State *L, int idx) —— 该函数返回战洪元素的类型。每种类型都对应一个常量,这些常量定义在头文件lua.h中。
注意:
该函数一般可用在一个switch语句中。另外,若要检查一个元素是否为真正的字符串或数字(无需转换的),也可以使用换个函数。
lua_type 返回类型常量定义如图:
3.lua_to*系类函数用于从栈中获取一个值,函数原型如图:
注:当Lua调用一个C函数返回时,Lua就会清空它的栈。所以,不要在C函数之外使用在C函数内获得的指向Lua字符串的指针。
④.其他对栈操作的函数:
1.int lua_gettop (lua_State *L) —— 该函数返回栈中元素的个数,也可以说是栈顶的索引。
2.void lua_settop (lua_State *L, int idx) —— 将栈顶设置为一个指定的位置,如果之前的栈顶比新设置的更高,那么搞出来的就被丢弃;
反之,会向栈中压入nil来不足大小。即修改栈中元素的数量。有一个特殊的调用, lua_settop (L, 0)能清空栈。在Lua中还定义了一个
特殊的宏:#define lua_pop(L,n) lua_settop(L, -(n)-1)
3.void lua_pushvalue (lua_State *L, int idx) —— 该函数会将指定索引上的值的副本压入栈。即,把堆栈上给定有效处索引处的元素作一
个拷贝压栈。
4.void lua_remove (lua_State *L, int idx) —— 该函数删除索引上的元素,并将该索引以上的元素下移以填补空缺。
5.void lua_insert (lua_State *L, int idx) —— 该函数会上移指定位置上的所有元素以开辟一个槽的空间,然后将栈顶元素移到该位置。
6.void lua_replace (lua_State *L, int idx) —— 函数会把栈顶元素移动到给定位置(并且把这个栈顶元素弹出), 不移动任何元素(因
此在那个位置处的值被覆盖掉)。
注:
lua_settop(L,-1) 和lua_insert (L,-1)不会对栈产生影响。
lua_settop(L,-1) 为将栈顶元素设置为它当前值。
lua_insert (L,-1)为将栈顶元素移动到栈顶
希望大家多多指正,共同进步。
每天进步一点点。。。