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

Is Lua source code written in clean code?

我正在阅读 source code of the Lua programming language lately and found some of the conventions unclear or confusing. For example, the str_reverse function in this file。它是否被认为是 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 函数 return *s,而且,将字符串的长度(从 L 获得)分配给 size_t l 变量。所以这个函数不仅 return 1 个变量,而且还改变了 1 个变量。

当你不知道某个东西是如何工作的时候,一个合理的结论是它可能写得不好。但是,上面的代码是可读的。我对 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, which is a wrapper function around lua_tolstring 添加错误检查。在对话框中:

str_reverseluaL_checklstring 说:

"Hey, I need a string - give me the address (stores it in s), also I need the length (stores it in l)."

luaL_checklstring 说:"yep, all is good - here ya go!"

你看,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,就像没有脚走路

无论如何,你如此 down-voted 真是太糟糕了,这可能是你为问题选择的标题 - 听起来你在抨击 Lua。除此之外,您的问题似乎是真实的-祝您好运,并在阅读他人代码的冒险中玩得开心!