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