源码已经更新在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
这是第二篇了吧。
更多【junit-Lua中文语言编程源码-第二节,更改lbaselib.c基础库模块, 使Lua支持中文关键词(与操作相关的)】相关视频教程:www.yxfzedu.com