当前位置: 首页 > news >正文

Lua中文语言编程源码-第五节,更改lcorolib.c协程库函数, 使Lua加载中文库关键词(与所有的基础库相关)

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

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

在src文件夹下的lcorolib.c协程库函数,Coroutine Library:表明这个C源文件实现了Lua的协程库(Coroutine Library),即提供了与协程相关的API和功能实现。

增加中文版协程函数名列表,保留英文版协程函数名列表。

原始的代码为:
static const luaL_Reg co_funcs[] = {{"create", luaB_cocreate},{"resume", luaB_coresume},{"running", luaB_corunning},{"status", luaB_costatus},{"wrap", luaB_cowrap},{"yield", luaB_yield},{"isyieldable", luaB_yieldable},{"close", luaB_close},{NULL, NULL}
};
 更改成以下代码:

/** 协程功能的注册表* 该表包含了所有协程相关函数的英文名和中文名,以及它们对应的实现函数。* 该注册表用于在Lua中注册这些协程函数,以便于在Lua脚本中调用。*/static const luaL_Reg co_funcs[] = {/* 英文版协程函数名 */{"create", luaB_cocreate}, /* 创建一个新的协程 */{"resume", luaB_coresume}, /* 恢复一个协程的执行 */{"running", luaB_corunning}, /* 获取当前正在运行的协程 */{"status", luaB_costatus}, /* 获取一个协程的状态 */{"wrap", luaB_cowrap}, /* 将一个函数封装成一个协程 */{"yield", luaB_yield}, /* 使当前协程挂起 */{"isyieldable", luaB_yieldable}, /* 检查当前协程是否可以挂起 */{"close", luaB_close}, /* 关闭一个协程 *//* 中文版协程函数名 */{"创建", luaB_cocreate}, /* 创建一个新的协程 */{"恢复", luaB_coresume}, /* 恢复一个协程的执行 */{"程名", luaB_corunning}, /* 获取当前正在运行的协程 */{"状态", luaB_costatus}, /* 获取一个协程的状态 */{"程包", luaB_cowrap}, /* 将一个函数封装成一个协程 */{"挂起", luaB_yield}, /* 使当前协程挂起 */{"可挂起", luaB_yieldable}, /* 检查当前协程是否可以挂起 */{"关闭", luaB_close}, /* 关闭一个协程 */{NULL, NULL} /* 注册表结束标志 */
};

为了保证中英文协程函数都可以加载,以便你可以复制英文原码来进行更改。所以保留了英文版协程函数名列表,这样就能使用两种文的函数。

{"create", luaB_cocreate}, /* 创建一个新的协程 */

 {"创建", luaB_cocreate}, /* 创建一个新的协程 */

其实它们都是加载同样的库名,算是加载了2次,以Lua内部算法,应该只会加载一次。

更改完之后,同样需要重新编译Lua的源码,实现以上列出的关键词的中文化。

注意,在Window系统下编译Lua, 最好将所有Lua的源码,重新保存成ANSI格式的文件,刚下载的默认的源码会是UTF-8格式的。

这个事情说三遍,

1,不然就会出现,Window下的UTF-8源码可编译,但Shell里的中文输出会乱码。
2,要不然就是Window的ANSI源码不可编译(假如你没做以上步骤),
3,如果是用ANSI格式的源码编译的Lua.exe,对应的,你在Window下写的Lua程序也是需要保存成ANSI格式的。这样就可以在Shell里输出正确的中文显示。

这里就上例程演示,协程中文使用。

第一个协程 = 协程.创建(函数(i)输出(i,"协程.程名",协程.程名()) 结束
)协程.恢复(第一个协程, "第一个协程运作")              -- 第一个协程运作  协程.程名       thread: 000001ba09d9a458        false
输出(i,"协程.状态", 协程.状态(第一个协程))           --i是传导不出来的,所以是nil, 协程.状态是(第一个协程)
输出("协程.程名是主线程么1?", 协程.程名())           -- 应该是的运行后对比   thread: 000001ba09d95ee8        true输出("--------------第一协程分界线------------------")程序封装的协程 = 协程.程包(函数(i)输出(i,"协程.程名",协程.程名())                   --程序封装第一次查协程.程名       thread: 00000268b6735628        false结束
)程序封装的协程("程序封装第一次")
--程序封装的协程(2)
输出("第一个协程.状态", 协程.状态(第一个协程))         -- 第一个协程.状态 废弃dead
输出("协程.程名是主线程么2?", 协程.程名())             -- 应该是的运行后对比   thread: 000001ba09d95ee8        true输出("--------------第二协程分界线------------------")-- 创建一个能迭代打印1到10的协程,同时在迭代到3时检查自身状态和当前运行的协程。
第二个协程 = 协程.创建(函数()因为 i=1,10 做输出("第二个协程第",i,"执行")                                   -- 打印协程第二个协程的执行次数。如果 i == 3 即输出("协程内查1次第二个协程.状态", 协程.状态(第二个协程))   -- 打印协程第二个协程的状态,在此处第二个协程为程名输出("有没有在第二协程内?")                                -- 此时还在的。输出("第二个协程.程名", 协程.程名())                        -- 打印当前正在运行的协程,为第二个协程的线程ID输出("协程内查2次第二个协程.状态", 协程.状态(第二个协程))    -- 打印协程第二个协程的状态,在此处第二个协程为程名输出("第二个协程.程名", 协程.程名())                        -- 打印当前正在运行的协程,为第二个协程的线程ID输出("其它协程.状态", 协程.状态())                          -- 打印其它协程的状态,在此处为nil空程名,已经跳出了第二个协程,此处直接为不输出了输出("其它协程.程名", 协程.程名())                          -- 打印其它协程的程名,已经跳出了第二个协程,此处直接为不输出了输出("第二个协程1.状态", 协程.状态(第二个协程))             -- 打印协程第二个协程的状态,因为被查其他协程状态后,已经跳出了第二个协程,此处直接为不输出了输出("有没有在第二协程内?")                                --已经跳出了第二个协程,此处直接为不输出了                结束协程.挂起()                                                     -- 暂停协程执行,让出CPU时间结束结束
)-- 分三次恢复协程第二个协程的执行,使其分别打印1到3。
协程.恢复(第二个协程) --1
协程.恢复(第二个协程) --2
协程.恢复(第二个协程) --3-- 打印协程第二个协程的状态和当前运行的协程状态。
输出("------------分界线回主线程了------------")输出("主线程查第二个协程.状态", 协程.状态(第二个协程))                      -- 挂起suspended,因为协程在 因为 循环中挂起yield了
输出("协程.程名是主程么3?", 协程.程名())                             --应该是的运行后对比   thread: 000001ba09d95ee8        true 
--输出("第二个协程.关闭", 协程.关闭(第二个协程))                     -- 如果已经不需要第二个协程再次运作,可以关闭协程。但这会导致协程代码里,之前在第二个协程内还有四行其它协程查询出错。
输出("协程.状态是主程么4?", 协程.状态(协程.程名()))                  --对上与第二个协程内的协程.状态() 留空查询时不同,此时应该是主线在运行。输出("-----结束分界线-----")
-- 以上代码展示了协程的创建、恢复执行、状态查询以及yield的使用方法。

应该能吃透协程,入门了吧,如果还不行,请关注我,后面会放出专门针对协程的更详细的说明。

相关文章:

Lua中文语言编程源码-第五节,更改lcorolib.c协程库函数, 使Lua加载中文库关键词(与所有的基础库相关)

源码已经更新在CSDN的码库里: git clone https://gitcode.com/funsion/CLua.git 在src文件夹下的lcorolib.c协程库函数,Coroutine Library:表明这个C源文件实现了Lua的协程库(Coroutine Library),即提供了…...

Docker学习之数据管理(超详解析)

Docker存储资源类型: 用户在使用 Docker 的过程中,势必需要查看容器内应用产生的数据,或者需要将容器内数据进行备份,甚至多个容器之间进行数据共享,这必然会涉及到容器的数据管理: (1&#xff…...

FDTD液晶折射率各项异性表示方法

由于FDTD的数据都是沿坐标轴的,各向异性材料的参数也需要根据坐标轴来输入。 首先要了解坐标变换。 坐标变换 这里以二维坐标变化为例。 矢量下我们可以发现OP可在两个坐标系下分别表示 接下来将两个坐标相互关联,这里以Xb举例,Yb同理 注…...

RoketMQ主从搭建

vim /etc/hosts# IP与域名映射,端口看自己的#nameserver 192.168.126.132 rocketmq-nameserver1 192.168.126.133 rocketmq-nameserver2# 注意主从节点不在同一个主机上 #broker 192.168.126.132 rocketmq-master1 192.168.126.133 rocketmq-master2#broker 192.168…...

Linux网络瑞士军刀 nc(netcat)

1.命令简介 nc(netcat)是一个短小精悍、功能实用、简单可靠的网络工具,主要有如下作用: (1)端口侦听,nc 可以作为 server 以 TCP 或 UDP 方式侦听指定端口; (2&#x…...

1.Spring入门

1.1 Spring简介 Spring是一个轻量级Java 企业级应用程序开发框架,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架,为开发Java应用程序提供全面的基础架构支持。 Spring Fra…...

【JavaEE Spring 项目】消息队列的设计

消息队列的设计 一、消息队列的背景知识二、需求分析核心概念⼀个⽣产者, ⼀个消费者N 个⽣产者, N 个消费者Broker Server 中的相关概念核⼼ API交换机类型 (Exchange Type)持久化⽹络通信消息应答 三、 模块划分四、 项⽬创建五、创建核心类创建 Exchange创建 MSGQUeue创建 B…...

SpringFramework学习笔记(Spring IoC,aop,tx)

SpringFramework 本篇笔记是基于尚硅谷学习资料的整理,涉及到其笔记的简化,补充,以及我在学习中遇到的与无法理解的问题及解决,如果想看完整及后续的笔记,可以去https://www.wolai.com/v5Kuct5ZtPeVBk4NBUGBWF查看官方…...

口腔管理平台 |基于springboot框架+ Mysql+Java+B/S结构的口腔管理平台 设计与实现(可运行源码+数据库+lw文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 会员功能 系统功能设计 数据库E-R图设计 lunwen参考…...

【设计模式】Java 设计模式之工厂模式(Factory Pattern)

工厂模式(Factory Pattern)深入解析 一、工厂模式概述 工厂模式是一种创建型设计模式,它提供了一种封装对象创建过程的方式,将对象的创建与使用分离。工厂模式的核心思想是将“实例化对象”的操作与“使用对象”的操作分开&…...

安卓UI面试题 36-40

36. 简述 getDimension、getDimensionPixelOffset 和 getDimensionPixelSize 三者的区别? 相同点 单位为dp/sp时,都会乘以density,单位为px则不乘不同点 1、getDimension返回的是float值 2、getDimensionPixelSize,返回的是int值,float转成int时,四舍五入 3、getDimensio…...

Java有哪些常用的集合?

1、典型回答 在 Java 中,常用的集合有以下几个: 列表(List):有序集合,可以包含重复元素。常见实现类有 ArrayList、LinkedList、 Vector 等集合(Set):无序集合,不允许包含重复元素。常见实现类有 HashSet、…...

虚拟机网络链接

在虚拟网络设置中找到如下界面: "子网 IP" 192.168.79.0/24 表示一个局域网络,它有254个可能的IP地址可供分配(192.168.79.1到192.168.79.254),255.255.255.0 是子网掩码,定义了网络和主机部分。…...

代码随想录阅读笔记-字符串【反转字符串】

题目 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假设数组中的所有字符都是 ASCII 码表中的可打印…...

4. Linux文件属性和目录系列

在 Linux 系统中,文件和目录是基本的文件系统组成部分。文件系统是用于组织和存储文件的一种结构,而文件和目录则是文件系统的核心元素。以下是对 Linux 文件和目录的详细解释: 1. 文件(File) 在 Linux 中,文件是数据的集合,可以是文本文件、二进制文件、设备文件等。…...

Linux第78步_使用原子整型操作来实现“互斥访问”共享资源

使用原子操作来实现“互斥访问”LED灯设备,目的是每次只允许一个应用程序使用LED灯。 1、创建MyAtomicLED目录 输入“cd /home/zgq/linux/Linux_Drivers/回车” 切换到“/home/zgq/linux/Linux_Drivers/”目录 输入“mkdir MyAtomicLED回车”,创建MyA…...

C++——C++11(3)

C——C11(3) lambda表达式(匿名的仿函数对象)一些注意点lambda捕捉列表[][&][this] lambda的赋值 function包装器function成员函数的包装 bind绑定参数 我们今天接着来了解一下C11一些新的特性,如果还没有看过上两…...

更改el-tabs默认样式,实现tab标签居中显示,标签对应内容使用另一个div显示

首先看效果图 如图所示&#xff0c;标签在浏览器窗口居中&#xff0c;但是下面的内容依然是默认从左到右&#xff0c;不会受到tab样式的影响 <template><div><div style"display: flex; justify-content: center; align-items: center;"><el-…...

微信小程序原生<map>地图实现标记多个位置以及map 组件 callout 自定义气泡

一、老规矩先上效果图: 二、在pages文件夹下新建image文件夹用来存放标记的图片。 三、代码片段 也可以参考小程序文档:https://developers.weixin.qq.com/miniprogram/dev/component/map.html index.wxml代码 <mapid="map"style="width: 100%; height:1…...

外包干了3天,技术明显进步。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入南京某软件公司&#xff0c;干了接近2年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了2年的功能测试&…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...