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

源码已经更新在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

这是第二篇了吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/750103.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法中出现的一些报错及其处理办法

Exception in thread “main” java.lang.UnsupportedOperationException 源代码是 Scanner s new Scanner(System.in);int target s.nextInt();Set<Integer> set new HashSet<>();for(int i0;i<target;i)set.add(s.nextInt());List<Integer> list s…

基础练习题之函数

前言 这些题目来自与一些刷题网站,以及c primer plus,继续练习 第一题 给你一个数&#xff0c;让他进行巴啦啦能量&#xff0c;沙鲁沙鲁&#xff0c;小魔仙大变身&#xff0c;如果进行变身的数不满足条件的话&#xff0c;就继续让他变身。。。直到满足条件为止。 巴啦啦能量…

SQLiteC/C++接口详细介绍之sqlite3类(十五)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十四&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十六&#xff09; 47.sqlite3_set_authorizer 用法&#xff…

11.进程的同步与互斥

11.进程的同步与互斥 计数信号量及其初始化 和王道里面学的PV操作一摸一样,带个count变量,带个阻塞队列 //D:\code\x86\code\start\start\source\kernel\include\ipc\sem.h #ifndef OS_SEM_H #define OS_SEM_H#include "tools/list.h"/*** 进程同步用的计数信号量*…

BswM模块配置指导

文章目录 BswM配置的分类自动配置:通信控制Rule:CC_ComMChannel_Rx自动配置:Ecu状态处理自动配置:模块初始化其他配置总结BswM模块是基础软件的模式管理模块,模式/状态控制都是由BswM模块进行,其实现的方式是通过 “请求-仲裁-执行”三步完成。本篇基于基本Can通信所用到…

string.h主要函数汇总

大家点击蓝色的连接就可以跳转查看了&#xff1a; strcpy,strncpy strchr strncmp strcmp strcat strncat strstr

2024计算机二级6

1.基本路径测试是属于白盒测试方法且是动态测试&#xff0c;静态测试不实际运行软件&#xff0c;主要通过人工进行分析。动态测试就是通常所说的上机测试&#xff0c;通过运行软件来检验软件中的动态行为和运行结果的正确性。百合测试的主要技术有逻辑覆盖测试、基本路径测试。…

UE5.1_自定义配置文件读取

UE5.1_自定义配置文件读取 读取配置文件时常规项目都会要求考虑的一个问题,然我接触过的UE类项目还真没考虑过,最近有个想法,奈何比较费劲,利用网上的教程跟进一下试试? 先基于Actor创建c++类(应该大家都会的吧),然后就是一下代码: MyConfig.h // Fill out your c…

CSS其他属性

文章目录 1. vertical-align1.1. 概念1.2. 常用值1.3. 作用1.4. 出现的情况一1.4.1. 原因1.4.2. 解决方案 1.5. 出现情况二1.5.1. 解决方案一1.5.2. 解决方案二1.5.3. 解决方案三 1.6. 出现情况三1.6.1. 原因1.6.2. 解决方案 2. 溢出效果2.1. 作用2.2. 属性名 3. 隐藏效果3.1. …

14双体系Java学习之数组

数组 ★小贴士 数组中保存固定数量的值&#xff0c;声明数组时需要制定数组中元素的类型&#xff0c;数组的长度在创建数组时设定。 保存数据的数据结构有很多&#xff0c;Java的标准函数库中就包含了许多复杂的数据结构&#xff0c;比如map、tree和set&#xff0c;以后会讲解的…

电脑那个部件坏了或者是哪个软件需要修复来看价钱

电脑维修价格表是多少&#xff1f; 价格取决于计算机的哪个部分损坏或哪个软件需要修复。 由于电脑中的部件非常多&#xff0c;而且会以各种奇怪的方式出现问题&#xff0c;下面我们就来看看具体的充电方法。 电脑维修价格表&#xff1a; 1. 重新安装系统。 安装XP系统通常需…

uniapp sqlite时在无法读取到已准备好数据的db文件中的数据

问题 {“code”:-1404,“message”:“android.database.sqlite.SQLiteException: no such table: user (Sqlite code 1): , while compiling: select * from user, (OS error - 2:No such file or directory),http://ask.dcloud.net.cn/article/282”} at pages/index/index.vu…

行走的机器人

题目描述 Bob 对机器人进行了编程&#xff0c;让它在平面迷宫中行走。 迷宫有一些障碍。 空单元格由字符"."表示&#xff0c;障碍物由"#"表示。 迷宫中只有一个机器人。 它的起始位置用字符"S"表示。 这个位置没有任何障碍。 迷宫中也只有一个…

<Linux> 线程的同步与互斥

目录 前言&#xff1a; 一、资源共享问题 &#xff08;一&#xff09;多线程并发访问 &#xff08;二&#xff09;临界资源与临界区 &#xff08;三&#xff09;“锁” 是什么 二、多线程抢票场景 &#xff08;一&#xff09;并发抢票 &#xff08;二&#xff09;并发访…

Segment Routing IPv6简介

定义 SRv6&#xff08;Segment Routing IPv6&#xff0c;基于IPv6转发平面的段路由&#xff09;是基于源路由理念而设计的在网络上转发IPv6数据包的一种协议。SRv6通过在IPv6报文中插入一个路由扩展头SRH&#xff08;Segment Routing Header&#xff09;&#xff0c;在SRH中压…

Ubuntu下安装microk8s用代理解决无法拉取镜像问题

首先安装microk8s: sudo snap install microk8s --classic得到输出&#xff1a; microk8s (1.28/stable) v1.28.7 from Canonical✓ installed设置 K8s 命令别名&#xff08;alias&#xff09; MicroK8s 支持的命令中&#xff0c;我们会相对高频的使用 microk8s.kubectl 这个…

渗透测试与HTTP中的PUT请求

PUT 请求用于向服务器更新指定资源&#xff0c;可以理解为对服务器上的资源进行修改操作。使用 PUT 请求方式会覆盖原有的资源内容&#xff0c;因此需要谨慎使用。 在渗透测试中&#xff0c;有可能服务端会暴露PUT请求的api&#xff0c;如修改用户权限的api&#xff0c;例如HT…

蓝桥杯练习系统(算法训练)ALGO-971 比较

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 给出一个n长的数列&#xff0c;再进行m次询问&#xff0c;每次询问询问两个区间[L1,R1]&#xff0c;[L2,R2]&#xff0c;  …

HarmonyOS NEXT应用开发—Grid和List内拖拽交换子组件位置

介绍 本示例分别通过onItemDrop()和onDrop()回调&#xff0c;实现子组件在Grid和List中的子组件位置交换。 效果图预览 使用说明&#xff1a; 拖拽Grid中子组件&#xff0c;到目标Grid子组件位置&#xff0c;进行两者位置互换。拖拽List中子组件&#xff0c;到目标List子组件…

数据可视化-ECharts Html项目实战(1)

在之前的文章中&#xff0c;我们学习了如何安装Visual Studio Code并下载插件&#xff0c;想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 安装 Visual Studio…