Covariant Script 函数
6.1 定义
function 函数名(参数列表(可选)) 语句块 end
参数列表
中的参数只能指定名称,参数名不可重复,各参数之间以,
分隔,如:
function test(a0, a1, a2) 语句块 end
函数在被调用时,将传入参数的引用,返回时也将返回引用
函数的变体包括lambda 表达式和成员函数
6.2 可变参数
在声明函数或lambda表达式时,可在参数列表中声明可变参数列表:
function (...参数名) 语句块 end
或
[]( ...参数名 ) -> 表达式
若声明了可变参数列表,则参数列表中不允许有其他任何形式的参数,这种函数我们称之为可变参数函数
可变参数函数在被调用时参数数量无上限
可变参数函数被调用时,可变参数列表会被以数组的形式呈现,若需要二次转发可使用展开运算符…
展开
6.3 协程(Coroutine)
要求:210506 或更高语言标准,3.4.2 以上解释器版本
CovScript 函数可以转换为协程(Coroutine)
相对于线程(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 可参考 解释器上下文环境 文档