lua语言是一个非常好用的语言,一个特点是,非常轻量级。二个特点是,非容易扩展。三个特点是,lua与C++互调非常容易。
可以将一个C++中类的大部分方法,都可以绑定成lua语言的一部分。
下面的代码,是绑定我的库中DatetTime类的代码:
1void InitDateTime(lua_State * L)
2{
3 using namespace luabind;
4 module(L,"zdh")
5 [
6 class_<XDate<XAnsiString> >("XDate")
7 .def(constructor<XInt,XInt,XInt>())
8 .def(constructor<>())
9 .def(constructor<XInt>())
10 .def(constructor<const XDate<XAnsiString> &>())
11 .def("SetNowDate",&XDate<XAnsiString>::SetNowDate)
12 .def("GetDay",&XDate<XAnsiString>::getDay)
13 .def("GetMonth",&XDate<XAnsiString>::getMonth)
14 .def("GetYear",&XDate<XAnsiString>::getYear)
15 .def("SetDate",(void (XDate<XAnsiString>::*)(zdh::XInt,zdh::XInt,zdh::XInt))&XDate<XAnsiString>::SetDate)
16 .def("SetDate",(void (XDate<XAnsiString>::*)(zdh::XInt))&XDate<XAnsiString>::SetDate)
17 .def("SetDate",(void (XDate<XAnsiString>::*)(const zdh::XDate<XAnsiString> &))&XDate<XAnsiString>::SetDate)
18 .def("ToString",(zdh::XAnsiString (XDate<XAnsiString>::*)(void) const)&XDate<XAnsiString>::ToString)
19 .def(self == XDate<XAnsiString>())
20 .def(self < XDate<XAnsiString>())
21 .def(self<=XDate<XAnsiString>())
22 ];
23 //(return_arg-type (classname::*)(arg1-type,grg2-type,))&classname::class_memberfunction
24 //(void(CBase::*)(long))&CBase::Show)
25}
下面是绑定我的库中字符串的代码
void InitString(lua_State * L)
{
using namespace luabind;
module(L,"zdh")
[
class_<XAnsiString>("XString")
.def(constructor<const XChar *>())
.def(constructor<>())
.def(constructor<const XAnsiString &>())
.def("c_str",(const zdh::XChar * (XAnsiString::*)(void) const)&XAnsiString::c_str)
.def("getLength",(zdh::XInt (XAnsiString::*)(void) const)&XAnsiString::getLength)
.def("Trim",(zdh::XAnsiString (XAnsiString::*)(void) const) &XAnsiString::Trim)
.def("Trim",(zdh::XAnsiString & (XAnsiString::*)(zdh::XAnsiString &) const)&XAnsiString::Trim)
];
}
下面两个,是调用lua的XAnsiString与XDateTime输出的函数。这两个函数在lua中有定义。
void PrintString(const XAnsiString & paramStr)
{
luabind::call_function<void>(gL,"printstring",boost::ref(paramStr));
}
void PrintDate(const XDate<XAnsiString> & paramDate)
{
luabind::call_function<void>(gL,"printdate",boost::ref(paramDate));
}
下面,就是定义这些函数的lua语言代码
----fun.lua--------
function addint ( x, y )
local r = (x + y) * 10
return r
end
function printstring(s)
print(s:c_str())
end
function printdate(d)
printstring(d:ToString())
end
然后,主要使用下面的main,就可以有了一个已经扩展了的lua语言运营环境。
int main(int argc, char * argv[])
{
lua_State *L = lua_open(); //初始化lua
gL = L;
luaL_openlibs(L); //载入所有lua标准库
luaL_dofile(L, "add.lua");
Init(L);
string s;
cout<<"lua>";
while(getline(cin,s)) //从cin中读入一行到s
{
if( s == "exit()" )
{
break;
}
//载入s里的lua代码后执行
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);
cout<<endl;
}
cout<<"lua>";
}
lua_close(L);//关闭
return 0;
}
这里,使用luabind使用lua语言扩展和C++相互调用,非常简单。