Lua5.0编程电子书中文版

这个电子书文档对于Lua开发者来说非常有帮助,是案头必备文档之一。虽然是5.0的版本,但是相差不是很多,因为5.1的更新是在于一些内部(internal)的改变,如GC机制和基于Register的虚拟机。

介绍通过ChunkSpy来分析Lua的虚拟机指令集。

准备用LuaTask来做一些Lua多线程方面的实验,这是源代码,有空看看。

Google Reader Yahoo Facebook Twitter Digg FriendFeed Delicious Google Translate
这篇日志发表于2009年12月3日 7:39 下午。 你可以订阅该日志的所有评论通过 RSS 2.0。 你可以发表评论,或者引用通告

5 条回应

评论(4)引用通告(1)

  1. Sil

    楼主,打扰下,请教一个lua源码问题。
    LUA_API void lua_insert (lua_State *L, int idx) {
    StkId p;
    StkId q;
    lua_lock(L);
    p = index2adr(L, idx);
    api_checkvalidindex(L, p);
    for (q = L->top; q>p; q–) setobjs2s(L, q, q-1);
    setobjs2s(L, p, L->top);
    lua_unlock(L);
    }

    这个函数中lua栈上增加一个TValue,但是L->top却没有加1,在下实在不明白原因,楼主可否指点一二。

    2009年12月7日 8:04 上午 | #1 @
  2. admin

    lua_insert

    void lua_insert (lua_State *L, int index);
    Moves the top element into the given valid index, shifting up the elements above this index to open space. Cannot be called with a pseudo-index, because a pseudo-index is not an actual stack position.

    这段Lua manual的lua_insert说明应该可以回答你的问题了,虽然名字上叫做insert,实际是栈顶与某个index的交换,top没有加那是因为只是交换没有新增。

    2009年12月7日 5:15 下午 | #2 @
  3. Sil

    感谢博主的回复,在下还有一个白痴问题相问,在看到如下两个宏时,
    #define adjustresults(L,nres) \
    { if (nres == LUA_MULTRET && L->top >= L->ci->top) L->ci->top = L->top; }

    #define checkresults(L,na,nr) \
    api_check(L, (nr) == LUA_MULTRET || (L->ci->top – L->top >= (nr) – (na)))
    有了一些疑惑,L->ci->top和L->top有什么关系,我看到注释上说ci是call info for current function,难道L->top不是随着当前函数调用情况调整的吗?
    博主的blog质量真是高,令人获益非浅,感谢你了。

    2009年12月7日 10:10 下午 | #3 @
  4. admin

    Sil,现在我还没有对Lua代码作比较细节上的研究,所以你的问题现在也没法回答。希望在后面代码阅读的时候能够解释这个问题。

    2009年12月7日 10:56 下午 | #4 @
  1. [...] 最好从Programming In Lua (简称PIL)中文版看起,非常有帮助,最好是逐字逐句的看。文档在这里可以下载:http://groups.google.com/group/lua5 或者 http://sunxiunan.com/?p=1512 [...]

发表评论

(Ctrl+Enter)

XHTML:你可以使用这些标签:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>