lua学习(五)

原创 2006年06月19日 09:19:00

上周看了一下lua的package和OO,感觉不错, lua并不像python程序员抨击的那样不优美.

顺便看了一下pil中,  c函数调用lua以及lua调用c函数的内容.
一、c调用lua函数一般的过程是:
1. load一个lua的文件,形成一个闭包并执行它
2. 在栈中压入函数的名称
3. 依次在栈中压入函数的实参
4. 使用lua_pcall调用lua函数。 形式是: lua_pcall(L, 参数个数,结果个数, 错误处理函数在栈中的索引)
    此时此函数相关的栈已经被清空。执行lua完毕后,如果成功,结果依次将压入栈中, 如果不成功,错误信息将 压入栈中
5. 从栈中读取返回结果或者错误信息。
下面是一则实例:
--[[
    func.lua
--]]
function f(x, y)
 return (x^2 * math.sin(y))/(1 - x)
end

/**
 *  main.cpp
 */
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}

void error (lua_State *L, const char *fmt, ...)
{
 va_list argp;
 va_start(argp, fmt);
 vfprintf(stderr, fmt, argp);
 va_end(argp);
 lua_close(L);
 exit(EXIT_FAILURE);
}

int main (void)
{

 lua_State *L = luaL_newstate();

 lua_cpcall(L, luaopen_base, 0);
 lua_cpcall(L, luaopen_io, 0);
 lua_cpcall(L, luaopen_math, 0);
 lua_cpcall(L, luaopen_string, 0);


 // 载入func.lua,并运行
 if (luaL_loadfile(L, "func.lua") || lua_pcall(L, 0, 0, 0))
  error(L, "cannot run configuration file: %s", lua_tostring(L, -1));

 double x, y;

 printf("请输入一个数字:");
 scanf("%d", &x);
 printf("%d/n", x);

 printf("再输入一个数字:");
 scanf("%d", &y);
 printf("%d/n", y);

 lua_getglobal(L, "f");
 lua_pushnumber(L, x);
 lua_pushnumber(L, y);
 if (lua_pcall(L, 2, 1, 0) != 0)
  error(L, "error running function `f': %s", lua_tostring(L, -1));

 if (!lua_isnumber(L, -1))
  error(L, "function `f' must return a number");
 double z = lua_tonumber(L, -1);
 lua_pop(L, 1); /* pop returned value */


 printf("结果是: /t %d' /n", z);

 lua_close(L);
}

二、lua调用c函数(写成库的例子)
lua调用库在windows下是dll文件,在unix/linux下面是so文件
vs的过程如下:
1. 新建一个dll的工程
2. 定义一个def文件,定义dll的导出,我的mylib.def定义如下:
LIBRARY  mylib.dll
DESCRIPTION "aol's first dll for lua"
EXPORTS
luaopen_mylib
3. 编写库,新建一个cpp文件.
4. 定义库函数,这里以pil的lsin函数,输出传入参数的sin()值
5. 定义luaL_reg数组,这个是注册一系列公开给lua调用的函数数组. 数组最后一个元素必须是 {NULL, NULL} 的luaL_reg结构用来做结束标识.
6. 用luaL_openlib声明主函数
实例如下:
/*
 * main.cpp
 */
#include <math.h>

extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}

static int l_sin (lua_State *L)
{
 double d = luaL_checknumber(L, 1);
 lua_pushnumber(L, sin(d));
 return 1; /* number of results */
}

static const struct luaL_reg mylib [] = {
 {"lsin", l_sin},
 {NULL, NULL} /* sentinel */
};

int luaopen_mylib (lua_State *L)
{
 luaL_openlib(L, "mylib", mylib, 0);
 return 1;
}
生成mylib.dll之后把文件拷入lua的安装根目录就可以调用了.
运行lua,进入lua环境,调用如下(lua版本5.1):
> package.loadlib("mylib.dll", "luaopen_mylib")()
> print(mylib.lsin(10))
-0.54402111088937
>


LUA学习路线汇总

语法   Lua程序设计Programming in Lua   果冻想-Lua 语法入门 源码   the implementation of lua 50 英文原版 中文翻译   Lua源码鉴...
  • lodypig
  • lodypig
  • 2016年12月09日 21:08
  • 1224

如何学习Lua编程

转自:http://lua.javaeye.com/blog/456531 最近迷上了使用Lua写一些方便的小程序,也看了一些关于lua的文档。发现不少人经常问一些很常见的问题,感觉好像还没有找到学习...
  • jphaoren
  • jphaoren
  • 2010年06月16日 02:04
  • 1625

tcpdump 高级过滤

转载自 http://blog.csdn.net/lepton126/article/details/8162926 - 只抓SYN 包 # tcpdump -i eth1 'tcp[tc...
  • sdsabc2000
  • sdsabc2000
  • 2016年06月12日 15:47
  • 447

ToLua学习笔记(五) Example 05 LuaCoroutine

ToLua学习笔记(五) Example 05 LuaCoroutine转载请注明出处四川包邮ToLua学习笔记五 Example 05 LuaCoroutine 代码 lua脚本 LuaBinder...
  • zxsean
  • zxsean
  • 2016年07月06日 14:00
  • 2781

Lua初学者入门要掌握的资料

Lua中国开发者同盟 http://www.luaer.cn/ 初识Lua,搭建环境和第一个程序 . http://blog.csdn.net/kingsollyu/article/detail...
  • zhangyulin54321
  • zhangyulin54321
  • 2013年10月15日 19:15
  • 1148

Lua学习(五)----表

-- Simple empty table mytable = {} print("Type of mytable is ",type(mytable)) mytable[1]= "Lua" my...
  • liu943367080
  • liu943367080
  • 2015年04月02日 15:02
  • 238

node.js学习认识五:Nodejs初阶之express

Nodejs初阶之express 2014-02-28 23:00 by 聂微东, 19735 阅读, 18 评论, 收藏, 编辑   PS: 2014/09/24 更新《Express 4.X...
  • u013864585
  • u013864585
  • 2015年05月25日 21:47
  • 776

libevent学习四

构建event_base 在你开始使用任何Libevent前,你需要先创建一个或多个event_base。每个event_base管理着一个event的集合,并可以检测出哪些event被激活了。如果e...
  • huanzai2
  • huanzai2
  • 2015年01月22日 23:00
  • 811

lua语言学习笔记

lua Table of Contents 1 lua的特殊之处 2 术语 3 编译器lua ...
  • lujun9972
  • lujun9972
  • 2015年05月26日 07:28
  • 375

Lua学习---lua源代码的分析顺序

Recommended reading order:     lmathlib.c, lstrlib.c: get familiar with the external C API. Don't b...
  • pengtwelve
  • pengtwelve
  • 2011年12月18日 20:48
  • 1483
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:lua学习(五)
举报原因:
原因补充:

(最多只允许输入30个字)