源码已经更新在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下方的三行处。
搜索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
这是第二篇了吧。