MSIPO技术圈 首页 IT技术 查看内容

Lua中文语言编程源码-第二节,更改lbaselib.c基础库模块, 使Lua支持中文关键词(与操作相关的)

2024-03-21

源码已经更新在CSDN的码库里:

git clone https://gitcode.com/funsion/CLua.git

在src文件夹下的lbaselib.c,是Lua的基础库模块。

增加中文保留字标识符列表,保留英文保留字标识符列表。

搜索luaB_collectgarbage函数: 控制和查询Lua垃圾回收器的状态。

static const char *const opts[] = {"stop", "restart", "collect",
    "count", "step", "setpause", "setstepmul",
    "isrunning", "generational", "incremental", NULL};
  static const int optsnum[] = {LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT,
    LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETPAUSE, LUA_GCSETSTEPMUL,
    LUA_GCISRUNNING, LUA_GCGEN, LUA_GCINC};

更改成以下代码:

  // 定义可选的操作字符串数组,包括中文和英文选项
  static const char *const opts[] = {
          /* 中文opts */
      "停止", "重启", "收集",
      "计数", "步进", "暂停", "步法",
      "运行中", "代际", "增量","空"
         /* 英文opts */
      "stop", "restart", "collect",
      "count", "step", "setpause", "setstepmul",
      "isrunning", "generational", "incremental", NULL};
  // 对应操作的Lua GC常量
  static const int optsnum[] = {
LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT,
LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETPAUSE, LUA_GCSETSTEPMUL,
LUA_GCISRUNNING, LUA_GCGEN, LUA_GCINC,
LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT,
LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETPAUSE, LUA_GCSETSTEPMUL,
LUA_GCISRUNNING, LUA_GCGEN, LUA_GCINC};

 为了保证中英文都可以使用,以便你可以复制英文原码来进行更改。所以保留了英文的关键词,这样就只能在optsnum[]数组中使用重复的关键词替用。细看LUA_GCSTOP下方的三行处。

在 Lua 环境中注册基础库函数中英文

搜索base_funcs 定义了 Lua 标准库中基础函数的映射。每个条目包含一个函数名和对应的 C 函数指针。

static const luaL_Reg base_funcs[] = {
  {"assert", luaB_assert},
  {"collectgarbage", luaB_collectgarbage},
  {"dofile", luaB_dofile},
  {"error", luaB_error},
  {"getmetatable", luaB_getmetatable},
  {"ipairs", luaB_ipairs},
  {"loadfile", luaB_loadfile},
  {"load", luaB_load},
  {"next", luaB_next},
  {"pairs", luaB_pairs},
  {"pcall", luaB_pcall},
  {"print", luaB_print},
  {"warn", luaB_warn},
  {"rawequal", luaB_rawequal},
  {"rawlen", luaB_rawlen},
  {"rawget", luaB_rawget},
  {"rawset", luaB_rawset},
  {"select", luaB_select},
  {"setmetatable", luaB_setmetatable},
  {"tonumber", luaB_tonumber},
  {"tostring", luaB_tostring},
  {"type", luaB_type},
  {"xpcall", luaB_xpcall},
  /* placeholders */
  {LUA_GNAME, NULL},
  {"_VERSION", NULL},
  {NULL, NULL}
};

更改成增加中文关键字对应的操作名称。

/* base_funcs 定义了 Lua 标准库中基础函数的映射。
 * 每个条目包含一个函数名和对应的 C 函数指针。
 * 这个数组用于在 Lua 环境中注册基础库函数。
 */
static const luaL_Reg base_funcs[] = {
    {"assert", luaB_assert}, // 断言。如果表达式为假,则抛出错误。
    {"断言", luaB_assert},
    {"collectgarbage", luaB_collectgarbage}, // 执行垃圾回收操作。
    {"集废", luaB_collectgarbage},
    {"收集垃圾", luaB_collectgarbage},
    {"dofile", luaB_dofile}, // 执行指定的文件。
    {"开文", luaB_dofile},
    {"执行文件", luaB_dofile},
    {"error", luaB_error}, // 抛出错误。
    {"错误", luaB_error},
    {"getmetatable", luaB_getmetatable}, // 获取给定对象的元表。
    {"取元", luaB_getmetatable},
    {"获取元表", luaB_getmetatable},
    {"ipairs", luaB_ipairs}, // 用于遍历数组的迭代器。
    {"序配", luaB_ipairs},
    {"loadfile", luaB_loadfile}, // 加载并编译指定的文件。
    {"载文", luaB_loadfile},
    {"加载文件", luaB_loadfile},
    {"load", luaB_load}, // 加载并编译指定的字符串。
    {"加载", luaB_load},
    {"next", luaB_next}, // 在表中进行迭代。
    {"下个", luaB_next},
    {"pairs", luaB_pairs}, // 用于遍历任何表的迭代器。
    {"匹配", luaB_pairs},
    {"pcall", luaB_pcall}, // 保护调用 C 函数,出错时不会崩溃。
    {"保驾", luaB_pcall},
    {"保护调用", luaB_pcall},
    {"print", luaB_print}, // 输出一个或多个值。
    {"输出", luaB_print},
    {"warn", luaB_warn}, // 发出警告信息。
    {"警告", luaB_warn},
    {"rawequal", luaB_rawequal}, // 比较两个值是否严格相等,不涉及元表。
    {"初等", luaB_rawequal},
    {"原始相等", luaB_rawequal},
    {"rawlen", luaB_rawlen}, // 返回一个对象的长度,不涉及元表。
    {"初长", luaB_rawlen},
    {"原始长度", luaB_rawlen},
    {"rawget", luaB_rawget}, // 从表中原始地获取键对应的值,不涉及元表。
    {"初取", luaB_rawget},
    {"原始获取", luaB_rawget},
    {"rawset", luaB_rawset}, // 在表中原始地设置键对应的值,不涉及元表。
    {"初设", luaB_rawset},
    {"原始设置", luaB_rawset},
    {"select", luaB_select}, // 选择和返回函数调用的参数。
    {"选择", luaB_select},
    {"setmetatable", luaB_setmetatable}, // 设置给定对象的元表。
    {"设元", luaB_setmetatable},
    {"设置元表", luaB_setmetatable},
    {"tonumber", luaB_tonumber}, // 将值转换为数字。
    {"转数", luaB_tonumber},
    {"转换为数字", luaB_tonumber},
    {"tostring", luaB_tostring}, // 将值转换为字符串。
    {"转字", luaB_tostring},
    {"转换为字符串", luaB_tostring},
    {"type", luaB_type}, // 返回给定值的类型。
    {"类型", luaB_type},
    {"xpcall", luaB_xpcall}, // 扩展版的 pcall,可以设置自定义的错误处理器。
    {"护航", luaB_xpcall},
    {"扩展保护调用", luaB_xpcall},
    /* placeholders */
    {LUA_GNAME, NULL}, // Lua 环境全局表的名称。
    {"_VERSION", NULL}, // Lua 版本字符串。
    {NULL, NULL}, // 结束标志。
    {"空", NULL} // 用于占位的空条目。
};

 这里调皮了一下,pcall和xpcall,分别命名为"保驾,护航”。为什么中文编程就不能有中方习惯的缩写呢。以后还想上成语。

然后保存后,即可以编译Lua的源码,初步实现以上列出的关键词的中文化。

注意,在Window系统下编译Lua, 最好将所有Lua的源码,重新保存成ANSI格式的文件,刚下载的默认的源码会是UTF-8格式的。

这个事情说三遍,

1,不然就会出现,Window下的UTF-8源码可编译,但Shell里的中文输出会乱码。
2,要不然就是Window的ANSI源码不可编译(假如你没做以上步骤),
3,如果是用ANSI格式的源码编译的Lua.exe,对应的,你在Window下写的Lua程序也是需要保存成ANSI格式的。这样就可以在Shell里输出正确的中文显示。

接下来,还是调试一下。

“如果演示.Lua",对又是他,但内容改了。

print(type("Hello world"))      --> string
print(type(10.4*3))             --> number
print(type(print))              --> function
print(type(type))               --> function
print(type(true))               --> boolean
print(type(nil))                --> nil
print(type(type(X)))            --> string
输出(类型("世界,你好!"))      --> string
输出(类型(10.4*3))             --> number
输出(类型(输出))              --> function
输出(类型(类型))               --> function
输出(类型(真))               --> boolean
输出(类型(虚))                --> nil
输出(类型(类型(X)))            --> string
输出("X的值为",X)        -->nil
输出("X的类型为",类型(X))        -->nil
--nil 作比较时应该加上双引号 ":
输出("X的类型==虚",类型(X)==虚)        -->false
输出("X的类型=='nil'",类型(X)=="nil")    -->true
输出("X==虚为",X==虚)            -->true

其实这个代码是我之前写的,中文编程入门(Lua5.4.6中文版)第二章 Lua 数据类型 第一节 8 个基本类型

里面的例程。编译后如下:

PS D:\lua> lua 如果演示.lua
string
number
function
function
boolean
nil
string
string
number
function
function
boolean
nil
string
X的值为 nil
X的类为 nil
X的类==虚       false
X的类=='nil'    true
X==虚为 true

这是第二篇了吧。

相关阅读

热门文章

    手机版|MSIPO技术圈 皖ICP备19022944号-2

    Copyright © 2024, msipo.com

    返回顶部