Lua入门(四)相关API

头文件lua.h定义了Lua提供的基础函数,包括创建Lua环境、调用Lua函数(如Lua_pcall)、读写Lua环境中的全局变量,以及注册供Lua调用的新函数等。lua.h中定义所有内容都有一个lua_前缀。
头文件lauxlib.h定义了辅助库提供的函数。它的所有定义都以luaL_开头(如luaL_loadbuffer)。辅助库是一个使用lua.h中API编写出的一个较高抽象层。Lua的所有标准库编写都用到了辅助库。基础API的设计保证原子性和正交性,而辅助库则侧重于解决具体的任务。

luaL_newstate函数用于创建一个新环境。当luaL_newstate创建一个新的环境时,新环境中没有包含预定义的函数,甚至没有print。为了使Lua保持小巧,所有的标准库都被组织到了不同的包中。在lualib.h中定义了打开这些库的函数,而辅助库函数luaL_openlibs则可以打开所有的标准库。
当创建好一个状态,并在其中加载了标准库后,就可以解释用户的输入了。程序调用luaL_loadbuffer来编译用户输入的每行内容。如果没有错误,此调用返回0,并向栈中压入编译后的程序块。然后程序调用lua_pcall,这个函数会将程序块从栈中弹出,并在保护模式中运行它。与luaL_loadbuffer类似,lua_pcall返回0表示没有错误。若发生错误,那么这些函数就会向栈中压入一条错误信息。用lua_tostring可以获取到这条信息,打印后可以用lua_pop把它从栈中删除。

相关API

//插入元素
void lua_pushnil(lua_State* L);
void lua_pushboolean(lua_State* L,int bool);
void lua_pushnumber(lua_State* L,lua_Number n);
void lua_pushstring(lua_State* L,const char* s);
等等
int lua_checkstack(lua_State* L,int sz);//用来检查栈中是否有足够的空间

lua_gettop函数返回栈中元素的个数,也可以说栈顶元素的索引;
lua_settop将栈顶设置为一个指定的位置,即修改栈中元素的数量;
lua_pushvalue函数将指定索引上值的副本压入栈;
lua_remove删除指定索引上的元素,并将该位置上的所有元素下移;
lua_replace弹出栈顶的值,并将该值设置到指定索引上;
lua_getglobal将相应的全局变量压入栈中;
lua_gettable把t[key]的值压栈,这里的t是指索引指向的值,而key是栈顶放的值,这个函数会弹出栈顶值把结果放在栈上相同的位置;
lua_pushstring(L,key);lua_gettable(L,-2)可以合并成lua_getfield(L,-1,key)一句;
lua_setglobal (lua_State *L, const char *name)从堆栈上弹出一个值,并将其设为全局变量 name 的新值;
lua_pcall (lua_State *L, int nargs, int nresults, int msgh) nargs个输入参数,nresults个输出参数,先压函数,再压输入参数,运算完成先删除栈中的函数以及参数,依次压入结果;

Lua调C

功能:类似ls命令行

//test.c
#include<dirent.h>
#include <string.h>
#include<errno.h>
#include<lua.h>
#include<lualib.h>
#include <lauxlib.h>

static int l_dir(lua_State* L) {
	DIR* dir;
	struct dirent* entry;
	int i;
	const char* path=luaL_checkstring(L,1);//第一个参数必须是string

	dir=opendir(path);
	if(dir==NULL) {
		lua_pushnil(L);
		lua_pushstring(L,strerror(errno));
		return 2;
	}

	lua_newtable(L);
	i=1;
	while((entry=readdir(dir))!=NULL){
		lua_pushnumber(L,i++);
		lua_pushstring(L,entry->d_name);
		lua_settable(L,-3);
	}
	closedir(dir);
	return 1;
}

static const struct luaL_Reg mylib[]={
	{"l_dir",l_dir},
	{NULL,NULL}
	
};

int luaopen_libmylib(lua_State* L){
	lua_newtable(L);
	luaL_setfuncs(L,mylib,0);
	return 1;
}
//

产生动态库:gcc -shared -fPIC -o libmylib.so test.c
在这里插入图片描述

--a.lua
local c = require "libmylib"

ret=c.l_dir("/")  -- 返回的table

for k,v in pairs(ret) do
	print(k,v)
end
--[[
输出:
1	sbin
2	data
3	home
4	srv
5	var
6	lost+found
7	mnt
8	tmp
9	usr
10	boot
11	initrd.img.old
12	bin
13	root
14	vmlinuz.old
15	initrd.img
16	sys
17	opt
18	media
19	..
20	lib64
21	proc
22	dev
23	etc
24	vmlinuz
25	run
26	.
27	lib
--]]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值