lua特性
05 Mar 2016
|
|
http://cloudwu.github.io/lua53doc/manual.html#pdf-require lua 参考手册
http://blog.jobbole.com/70480/ 快速lua
http://book.luaer.cn/ 参考手册
http://www.cnblogs.com/sevenyuan/p/4511808.html lua堆栈
lua和c通信时有这样的约定: 所有的lua中的值由lua来管理, c++中产生的值lua不知道, 类似表达了这样一种意思: “如果你(c/c++)想要什么, 你告诉我(lua), 我来产生, 然后放到栈上, 你只能通过api来操作这个值, 我只管我的世界”, 这个很重要, 因为:
“如果你想要什么, 你告诉我, 我来产生”就可以保证, 凡是lua中的变量, lua要负责这些变量的生命周期和垃圾回收, 所以, 必须由lua来创建这些值(在创建时就加入了生命周期管理要用到的簿记信息)
“然后放到栈上, 你只能通过api来操作这个值”, lua api给c提供了一套完备的操作界面, 这个就相当于约定的通信协议, 如果lua客户使用这个操作界面, 那么lua本身不会出现任何”意料之外”的错误.
“我只管我的世界”这句话体现了lua和c/c++作为两个不同系统的分界, c/c++中的值, lua是不知道的, lua只负责它的世界。
c调用lua
#include <stdio.h>
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
int main(int argc,char ** argv)
{
/* 初始化 Lua */
lua_State *L = luaL_newstate();
/* 载入Lua基本库 */
luaL_openlibs(L);
/* 运行脚本 */
luaL_dofile(L, "./luafunc.lua");
//获取lua中的showinfo函数
lua_getglobal(L, "showinfo");
//cpp 调用无参数的lua函数,无返回值
lua_pcall(L, 0, 0, 0);
//主动清理堆栈,也可以不调用
const char * pstr="世界如此美好";
lua_getglobal(L, "showstr");
lua_pushstring(L, pstr);
//cpp 调用一个参数的的lua函数,无返回值
lua_pcall(L, 1, 0, 0);
lua_getglobal(L, "add");
//参数从左到右压栈
lua_pushinteger(L, 2);
lua_pushinteger(L, 3);
lua_pcall(L, 2, 1, 0);
printf("lua add function return val is %d \n", lua_tointeger(L, -1));
/* 清除Lua */
lua_close(L);
return 1;
}
//gcc -o testlua testlua.c -I/usr/local/include -L/usr/local/lib -llua -ldl -lm
print("lua script func.lua have been load ")
function showinfo()
print("welcome to lua world ")
end
function showstr(str)
print("The string you input is " .. str)
end
function add(x,y)
return x+y;
end