Covariant Script 函数

function 函数名(参数列表(可选))
    语句块
end

参数列表中的参数只能指定名称,参数名不可重复,各参数之间以,分隔,如:

function test(a0, a1, a2)
    语句块
end


函数在被调用时,将传入参数的引用,返回时也将返回引用

函数的变体包括lambda 表达式成员函数



在声明函数或lambda表达式时,可在参数列表中声明可变参数列表

function (...参数名)
  语句块
end

[]( ...参数名 ) -> 表达式

若声明了可变参数列表,则参数列表中不允许有其他任何形式的参数,这种函数我们称之为可变参数函数

可变参数函数在被调用时参数数量无上限

可变参数函数被调用时,可变参数列表会被以数组的形式呈现,若需要二次转发可使用展开运算符展开

要求: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 可参考 解释器上下文环境 文档