Lua源代码是用干净的代码编写的吗?

时间:2018-11-28 04:53:48

标签: c lua programming-languages code-cleanup

我最近在阅读source code of the Lua编程语言时,发现某些约定不清楚或令人困惑。例如,this file中的str_reverse函数。它在C语言中被视为干净的代码和易于理解的代码吗?

static int str_reverse (lua_State *L) {
   size_t l, i;
   luaL_Buffer b;
   const char *s = luaL_checklstring(L, 1, &l);
   char *p = luaL_buffinitsize(L, &b, l);
   for (i = 0; i < l; i++)
       p[i] = s[l - i - 1];
   luaL_pushresultsize(&b, l);
   return 1;
}

在这些行中:

char *p = luaL_buffinitsize(L, &b, l);
for (i = 0; i < l; i++)
   p[i] = s[l - i - 1];

* p被创建以存储反转后的字符串值。在那之后,我看不到它在其他任何地方使用。然后查看char *p = luaL_buffinitsize(L, &b, l);,它表明* p是luaL_Buffer b;的一个属性,这现在就可以理解为什么不再使用* p了,因为在下一行,b在使用

此外,在此行const char *s = luaL_checklstring(L, 1, &l);中,此luaL_checklstring函数返回*s,而且还为size_t l变量分配了字符串的长度(从L中得到)。因此,此函数不仅会返回1个变量,而且还会沿途更改1个变量。

1 个答案:

答案 0 :(得分:2)

当您不知道某件作品的工作原理时,可以得出合理的结论,即它可能写得不好。但是,上面的代码是可读的。我对lua一无所知,对C也不了解,我能够解读正在发生的事情。

可能会帮助您的第一件事是了解如何调用str_reverse,启动一个解释器:

> str = "foo"         /* create a string in a lua state */
> string.reverse(str) /* indirectly invokes str_reverse */
oof                   /* result */

str_reverse要做的第一件事是调用luaL_checklstring,它是lua_tolstring周围的包装函数,用于添加错误检查。在对话框中:

str_reverseluaL_checklstring说:

“嘿,我需要一个字符串-给我地址(将其存储在s中),我也需要长度(将其存储在l中)。”

luaL_checklstring说:“是的,一切都很好-来吧!”

您知道,C语言需要知道所有内容的大小,以便它可以分配适当的内存量。由于str_reverse需要为反转的字符串分配内存(更确切地说,如果luaL_Buffer b的大小不足以容纳该字符串,则需要调整大小),因此它告诉luaL_checklstring给出长度也一样如果str_reverse不在乎长度,则将传递NULL而不是l。这就是Lua API的设计方式-对我而言似乎是可读的。

p不存储字符串的值-反向的字符串作为成员存储在b中。 p基本上是一种快捷方式,请考虑以下几点:

/* disregard the pointer returned by buffinitsize */
luaL_buffinitsize(L, &b, l);
for (i = 0; i < l; i++)
    b->b[i] = s[l - i - 1];

上面的代码应该相同。除了现在,luaL_Buffer的血腥细节已经暴露出来了……不是很好。

您需要阅读指针。如果您不了解指针,您将永远不会完全理解C,就像没有脚走路一样。

无论如何,这真让您感到沮丧,这很可能是您为问题选择的标题-听起来像是在抨击Lua。除此之外,您的问题似乎是真实的-祝您好运,并在阅读他人代码的过程中玩得开心!