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


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

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

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

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

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

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

    更改成以下代码:

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

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

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

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

    1. static const luaL_Reg base_funcs[] = {
    2. {"assert", luaB_assert},
    3. {"collectgarbage", luaB_collectgarbage},
    4. {"dofile", luaB_dofile},
    5. {"error", luaB_error},
    6. {"getmetatable", luaB_getmetatable},
    7. {"ipairs", luaB_ipairs},
    8. {"loadfile", luaB_loadfile},
    9. {"load", luaB_load},
    10. {"next", luaB_next},
    11. {"pairs", luaB_pairs},
    12. {"pcall", luaB_pcall},
    13. {"print", luaB_print},
    14. {"warn", luaB_warn},
    15. {"rawequal", luaB_rawequal},
    16. {"rawlen", luaB_rawlen},
    17. {"rawget", luaB_rawget},
    18. {"rawset", luaB_rawset},
    19. {"select", luaB_select},
    20. {"setmetatable", luaB_setmetatable},
    21. {"tonumber", luaB_tonumber},
    22. {"tostring", luaB_tostring},
    23. {"type", luaB_type},
    24. {"xpcall", luaB_xpcall},
    25. /* placeholders */
    26. {LUA_GNAME, NULL},
    27. {"_VERSION", NULL},
    28. {NULL, NULL}
    29. };

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

    1. /* base_funcs 定义了 Lua 标准库中基础函数的映射。
    2. * 每个条目包含一个函数名和对应的 C 函数指针。
    3. * 这个数组用于在 Lua 环境中注册基础库函数。
    4. */
    5. static const luaL_Reg base_funcs[] = {
    6. {"assert", luaB_assert}, // 断言。如果表达式为假,则抛出错误。
    7. {"断言", luaB_assert},
    8. {"collectgarbage", luaB_collectgarbage}, // 执行垃圾回收操作。
    9. {"集废", luaB_collectgarbage},
    10. {"收集垃圾", luaB_collectgarbage},
    11. {"dofile", luaB_dofile}, // 执行指定的文件。
    12. {"开文", luaB_dofile},
    13. {"执行文件", luaB_dofile},
    14. {"error", luaB_error}, // 抛出错误。
    15. {"错误", luaB_error},
    16. {"getmetatable", luaB_getmetatable}, // 获取给定对象的元表。
    17. {"取元", luaB_getmetatable},
    18. {"获取元表", luaB_getmetatable},
    19. {"ipairs", luaB_ipairs}, // 用于遍历数组的迭代器。
    20. {"序配", luaB_ipairs},
    21. {"loadfile", luaB_loadfile}, // 加载并编译指定的文件。
    22. {"载文", luaB_loadfile},
    23. {"加载文件", luaB_loadfile},
    24. {"load", luaB_load}, // 加载并编译指定的字符串。
    25. {"加载", luaB_load},
    26. {"next", luaB_next}, // 在表中进行迭代。
    27. {"下个", luaB_next},
    28. {"pairs", luaB_pairs}, // 用于遍历任何表的迭代器。
    29. {"匹配", luaB_pairs},
    30. {"pcall", luaB_pcall}, // 保护调用 C 函数,出错时不会崩溃。
    31. {"保驾", luaB_pcall},
    32. {"保护调用", luaB_pcall},
    33. {"print", luaB_print}, // 输出一个或多个值。
    34. {"输出", luaB_print},
    35. {"warn", luaB_warn}, // 发出警告信息。
    36. {"警告", luaB_warn},
    37. {"rawequal", luaB_rawequal}, // 比较两个值是否严格相等,不涉及元表。
    38. {"初等", luaB_rawequal},
    39. {"原始相等", luaB_rawequal},
    40. {"rawlen", luaB_rawlen}, // 返回一个对象的长度,不涉及元表。
    41. {"初长", luaB_rawlen},
    42. {"原始长度", luaB_rawlen},
    43. {"rawget", luaB_rawget}, // 从表中原始地获取键对应的值,不涉及元表。
    44. {"初取", luaB_rawget},
    45. {"原始获取", luaB_rawget},
    46. {"rawset", luaB_rawset}, // 在表中原始地设置键对应的值,不涉及元表。
    47. {"初设", luaB_rawset},
    48. {"原始设置", luaB_rawset},
    49. {"select", luaB_select}, // 选择和返回函数调用的参数。
    50. {"选择", luaB_select},
    51. {"setmetatable", luaB_setmetatable}, // 设置给定对象的元表。
    52. {"设元", luaB_setmetatable},
    53. {"设置元表", luaB_setmetatable},
    54. {"tonumber", luaB_tonumber}, // 将值转换为数字。
    55. {"转数", luaB_tonumber},
    56. {"转换为数字", luaB_tonumber},
    57. {"tostring", luaB_tostring}, // 将值转换为字符串。
    58. {"转字", luaB_tostring},
    59. {"转换为字符串", luaB_tostring},
    60. {"type", luaB_type}, // 返回给定值的类型。
    61. {"类型", luaB_type},
    62. {"xpcall", luaB_xpcall}, // 扩展版的 pcall,可以设置自定义的错误处理器。
    63. {"护航", luaB_xpcall},
    64. {"扩展保护调用", luaB_xpcall},
    65. /* placeholders */
    66. {LUA_GNAME, NULL}, // Lua 环境全局表的名称。
    67. {"_VERSION", NULL}, // Lua 版本字符串。
    68. {NULL, NULL}, // 结束标志。
    69. {"空", NULL} // 用于占位的空条目。
    70. };

     这里调皮了一下,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",对又是他,但内容改了。

    1. print(type("Hello world")) --> string
    2. print(type(10.4*3)) --> number
    3. print(type(print)) --> function
    4. print(type(type)) --> function
    5. print(type(true)) --> boolean
    6. print(type(nil)) --> nil
    7. print(type(type(X))) --> string
    8. 输出(类型("世界,你好!")) --> string
    9. 输出(类型(10.4*3)) --> number
    10. 输出(类型(输出)) --> function
    11. 输出(类型(类型)) --> function
    12. 输出(类型(真)) --> boolean
    13. 输出(类型(虚)) --> nil
    14. 输出(类型(类型(X))) --> string
    15. 输出("X的值为",X) -->nil
    16. 输出("X的类型为",类型(X)) -->nil
    17. --nil 作比较时应该加上双引号 ":
    18. 输出("X的类型==",类型(X)==虚) -->false
    19. 输出("X的类型=='nil'",类型(X)=="nil") -->true
    20. 输出("X==虚为",X==虚) -->true

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

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

    1. PS D:\lua> lua 如果演示.lua
    2. string
    3. number
    4. function
    5. function
    6. boolean
    7. nil
    8. string
    9. string
    10. number
    11. function
    12. function
    13. boolean
    14. nil
    15. string
    16. X的值为 nil
    17. X的类为 nil
    18. X的类==false
    19. X的类=='nil' true
    20. X==虚为 true

    这是第二篇了吧。

  • 相关阅读:
    实用工具推荐--GIF动图裁剪工具IIMG(免注册且免费)
    CVF_统一多模态之文字生成
    nacos源码深度剖析理解之注册中心
    第一章《初学者问题大集合》第8节:Java程序初步释疑
    缺少微信小程序测试经验?这篇文章带你从0开始
    为什么说企业需要MES系统? MES系统的作用和意义是什么?
    【培训课程专用】中断路由代码导读:当cpu运行在TEE来了一个Secure Group1中断
    销售火爆,APS自动排产提升咖啡机家电企业生产管理效益
    iOS 协程编程
    基于springboot实现福聚苑社区团购平台系统项目【项目源码】
  • 原文地址:https://blog.csdn.net/funsion/article/details/136694534