我们在使用lua的时候一定觉得这门语言很高级,什么都不用去处理而且速度很快,超过了一般的脚本语言,这是因为其实lua内部是由c来管理内存的分配和释放的,用起来有点像java的垃圾回收器一样,但完全不是一个东西,看过lua源码的人都知道,它是自己建立了一套lua内存管理机制的,由c语言完成真正的内存分配和释放。异同点只要看垃圾回收机制的三大要素就知道了。
今天我来说下lua中有内置库的一些函数的组成,和自己如何对lua添加新的方法,
这个是大家常用的string库的导出函数表,这样大家肯定就知道lua和c是怎么关联的了,你用过string一定知道find这个函数了,我们就从这个函数的实现说起把,然后学会了这个,你就可以自己添加处理unicode编码的问题了,你可以仿照lstrlib和lstring这两块自己实现一个lua的unicode处理库。这课对没有c语言基础的人来说难度很大,建议大家看本文之前先去复习下c语言基础。然后再看本文,当然没学过c的建议去学习下,不想学习c的可以不用看本文了。
废话不多说了,我们先来看代码:
static int str_find (lua_State *L) {
return str_find_aux(L, 1);
}
这个好像很简单直接返回了另一个函数,那就让我们先看下这个函数吧,代码依然如下:
static int str_find_aux (lua_State *L, int find) {
size_t ls, lp;
const char *s = luaL_checklstring(L, 1, &ls);
const char *p = luaL_checklstring(L, 2, &lp);
size_t init = posrelat(luaL_optinteger(L, 3, 1), ls);
if (init < 1) init = 1;
else if (init > ls + 1) { /* start after string's end? */
lua_pushnil(L); /* cannot find anything */
return 1;
}
/* explicit request or no special characters? */
if (find && (lua_toboolean(L, 4) || nospecials(p, lp))) {
/* do a plain search */
const char *s2 = lmemfind(s + init - 1, ls - init + 1, p, lp);
if (s2) {
lua_pushinteger(L, s2 - s + 1);
lua_pushinteger(L, s2 - s + lp);
return 2;
}
}
else {
MatchState ms;
const char *s1 = s + init - 1;
int anchor = (*p == '^');
if (anchor) {
p++; lp--; /* skip anchor character */
}
ms.L = L;
ms.src_init = s;
ms.src_end = s + ls;
ms.p_end = p + lp;
do {
const char *res;
ms.level = 0;
if ((res=match(&ms, s1, p)) != NULL) {
if (find) {
lua_pushinteger(L, s1 - s + 1); /* start */
lua_pushinteger(L, res - s); /* end */
return push_captures(&ms, NULL, 0) + 2;
}
else
return push_captures(&ms, s1, res);
}
} while (s1++ < ms.src_end && !anchor);
}
lua_pushnil(L); /* not found */
return 1;
}
函数有点长,不过这个很好理解,首先先对字符串进行检测是否合法,然后进行计算长度,以及从字符串中查找是否有要查找的字符串。并将个查找结果添加入lua_state中,然后通过弹出的方式返回给lua脚本编写的用户。这样我们就能很好的理解为什么lua可以返回多个函数值了。它把所有的返回值都放入栈中。然后在返回的时候依次的返回来,所以这不是什么神奇的东西,只是个语法糖o(∩_∩)o 哈哈。:-)
lua_pushinteger(L, s1 - s + 1); /* start */
lua_pushinteger(L, res - s); /* end */
这两句你熟悉吗?若不熟悉请再将lua好好学习下吧。lua
呵呵,这样看来我可以说一句只要是图灵完全的语言都一样,什么语言都可以实现你想要的东西,只要你头脑清楚哈哈。编程范式和架构设计是关键。不过这里是lua讨论文章,请允许我废话几句。lua中的库其实都是c实现的,大家有心可以自己去实现,若能将两者结合,你会成为一个优秀的程序员和一枚强力的架构师。