====== 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#解释器上下文环境|解释器上下文环境]] 文档