====== Covariant Script 函数 ====== ===== 6.1 定义 ===== function 函数名(参数列表(可选)) 语句块 end ''参数列表''中的参数只能指定名称,参数名**不可重复**,各参数之间以'',''分隔,如: function test(a0, a1, a2) 语句块 end \\ **函数在被调用时,将传入参数的引用,返回时也将返回引用** 函数的变体包括[[:manual:reference:grammar:expression:main_page#3.6 lambda 表达式|lambda 表达式]]和[[:manual:reference:grammar:structure:main_page#7.2 成员函数|成员函数]] ----- \\ ===== 6.2 可变参数 ===== 在声明函数或**lambda**表达式时,可在参数列表中声明**可变参数列表**: function (...参数名) 语句块 end []( ...参数名 ) -> 表达式 若声明了可变参数列表,则参数列表中不允许有其他任何形式的参数,这种函数我们称之为**可变参数函数** 可变参数函数在被调用时参数数量**无上限** 可变参数函数被调用时,可变参数列表会被以数组的形式呈现,若需要二次转发可使用展开运算符''...''展开 ===== 6.3 协程(Coroutine) ===== //要求:210506 或更高语言标准,3.4.2 以上解释器版本// CovScript 函数可以转换为协程(Coroutine) {{:manual:reference:grammar:function:coroutines.png?400|}} 相对于线程(Thread),多个协程不会同时运行,仅在单个线程内进行函数执行上下文的切换,从而实现了并发编程 更进一步说,线程是由调度器进行**抢占式调度**,在多 CPU 系统中会**并行**执行; 而协程是主动**让出(yield)**时间片,仅运行在单个 CPU 核心上,属于**协作式调度** CovScript 协程是**堆栈式非对称协程(Stackful Asymmetric Coroutine)**: * 堆栈式意味着每个协程都拥有独立的栈,并会随着协程切换而一同切换 * 非对称式意味着语言运行时不会对协程进行主动调度,需要由协程主动进行调度 function co_func() system.out.println("Coroutine started") context.yield() system.out.println("Coroutine resumed") end var co = context.create_co(co_func) system.out.println("Launch coroutine") context.resume(co) system.out.println("Resume coroutine") context.resume(co) 这是一个简单的示例,命令行会依次输出: Launch coroutine Coroutine started Resume coroutine Coroutine resumed 更多协程相关的 API 可参考 [[manual:reference:package:standard:main_page#解释器上下文环境|解释器上下文环境]] 文档