Lua是一个嵌入式的脚本语言,它不仅可以单独使用还能与其它语言混合调用。
Lua与其它脚本语言相比,其突出优势在于:
- 可扩展性。Lua的扩展性非常卓越,以至于很多人把Lua用作搭建领域语言的工具(注:比如游戏脚本)。Lua被设计为易于
扩展的,可以通过Lua代码或者
C代码扩展,Lua的很多功能都是通过外部库来扩展的。Lua很容易与C/C++、java、fortran、Smalltalk、Ada,以及其他语言
接口。
- 简单。Lua本身简单,小巧;内容少但功能强大,这使得Lua易于学习,很容易实现一些小的应用。他的完全发布版(代码、手册以及某些平台的二进制文件)仅用一张软盘就可以装得下。
- 高效率。Lua有很高的执行效率,统计表明Lua是目前平均效率最高的脚本语言。
- 与
平台无关。Lua几乎可以运行在所有我们听说过的系统上,如NextStep、OS/2、PlayStation II (Sony)、Mac
OS-9、OS X、BeOS、MS-DOS、IBM mainframes、EPOC、PalmOS、MCF5206eLITE
Evaluation Board、RISC
OS,及所有的Windows和Unix。Lua不是通过使用条件编译实现平台无关,而是完全使用ANSI (ISO) C,这意味着只要你有ANSI
C编译器你就可以编译并使用Lua。
要在C++中使用Lua非常简单,不管是GCC,VC还是C++Builder, 最简单的方法就是把中除
lua.c,
luac.c和
print.c以外的所有c文件与你的代码一起编译链接(
或加入到工程中)即可。
当然,为了方便维护,最好还是先把Lua编译成库文件再加入工程。方法如下:
GCC
直接在Lua所在目录下make [环境]
这里的[环境]可以是:aix ansi bsd freebsd generic linux macosx mingw posix solaris
如果你的环境不在这个列表中,你可以试试ansi或posix。
VC
在命令行环境下进入Lua所在目录,执行etc\luavs.bat编译。
C++Builder
请看我的Blog,如何在C++Builder里编译Lua
头文件
因为Lua是用C语言写的,除非编译lua库时指定编译器强制以C++方式编译,否则在C++工程中应该这样包含lua头文件:
- extern "C" {
- #include "lua.h"
- #include "lualib.h"
- #include "lauxlib.h"
- }
例一,简单运行Lua代码
- extern "C" {
- #include "lua.h"
- #include "lualib.h"
- #include "lauxlib.h"
- }
-
- #include
- #include
- using namespace std;
-
- int main()
- {
- lua_State *L = lua_open();
- luaL_openlibs(L);
-
- string s;
- while(getline(cin,s))
- {
-
- bool err = luaL_loadbuffer(L, s.c_str(), s.length(),
- "line") || lua_pcall(L, 0, 0, 0);
- if(err)
- {
-
- cerr << lua_tostring(L, -1);
-
- lua_pop(L, 1);
- }
- }
-
- lua_close(L);
- return 0;
- }
这已经是一个功能完备的交互方式Lua解释器了。
输入print "hello world"
输出hello world
输入for i=1,10 do print(i) end
输出从1到10
要调用Lua,首先要使用
lua_open(
对于5.0以后版本的Lua,建议使用luaL_newstate代替)产生一个
lua_State,在使用完后调用
lua_close关闭。
所有Lua与C之间交换的数据都是通过Lua中的栈来中转的。
在本例中:
luaL_loadbuffer的功能是载入并编译内存中的一段Lua代码,然后作为一个代码块(
称为chunk)压入栈中,其中的最后一个参数作为代码块的名称用于调试。和它功能类似的还有
luaL_loadfile(载入文件),
luaL_loadstring(载入字符串,本例中也可用它代替
luaL_loadbuffer)。它们有一个相同的前缀:
luaL_,为了简化编程,Lua C API将库中的核心函数包装后作为辅助函数提供一些常用功能,它们的形式都是
luaL_*,如这里的三个
luaL_load*都调用了
lua_load。
lua_pcall从栈顶取得函数并执行,如果出错,则返回一个非0值并把错误信息压入栈顶。关于它的更详细信息会在“”中介绍。
如果宿主程序检测到错误,就用
lua_tostring从栈顶取得错误信息转成字符串输出,然后弹出这个错误信息。
lua_tostring里
的第二个参数指定要操作的数据处于栈的哪个位置,因为所有的数据只能通过栈来交换,所以很多Lua的C
API都会要求指定栈的位置。1表示在栈中的第一个元素(也就是第一个被压入栈的),下一个索引是2,以此类推。我们也可以用栈顶作为参照来存取元素,使
用负数:-1指出栈顶元素(也就是最后被压入的),-2指出它的前一个元素,以此类推。
阅读(10296) | 评论(0) | 转发(1) |