源码已经更新在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
这是第二篇了吧。