50. 协程和其他生成器支持

COROUTINES 模块公开了协程基础设施以及其他 yielding 工具。

下面的示例说明了如何循环访问树的元素。each_async_generator 直接实现迭代器,其中 ‘yield_from’ 辅助函数用于继续迭代叶子。[coroutine] 注解将 function 转换为 coroutine。 如果需要,函数的返回类型可以指定协程 yield type:

require daslib/coroutines

struct Tree
    data : int
    left, right : Tree?

// yield from example
def each_async_generator(tree : Tree?)
    return <- generator<int>() <|
        if tree.left != null
            yeild_from <| each_async_generator(tree.left)
        yield tree.data
        if tree.right != null
            yeild_from <| each_async_generator(tree.right)
        return false

// coroutine as function
[coroutine]
def each_async(tree : Tree?) : int
    if tree.left != null
        co_await <| each_async(tree.left)
    yield tree.data
    if tree.right != null
        co_await <| each_async(tree.right)

所有函数和符号都在 “coroutines” 模块中,使用 require 来访问它。

require daslib/coroutines

50.1. 类型别名

Coroutine = iterator<bool>

Coroutine which does not yield and value.

Coroutines = array<iterator<bool>>

Collection of coroutines, which do not yield any value.

50.2. 函数注释

coroutine

此宏将协程函数转换为 generator,添加 return false。 协同例程的 Daslang 实施是基于生成器的。函数转换为状态机,状态机可以恢复和暂停。该函数将转换为生成器。 如果 generator 是 void 协程,则 Generator 会生成 bool,否则会生成 return 类型。 如果指定了返回类型,则协程可以用作生成器的高级形式。

50.3. 调用宏

co_continue

此宏将 co_continue 转换为 yield true。 这个想法是,没有指定类型的协程位于产生 bool 的协程之下。 这样 co_continue() 不会分散人们对它是一个generator<bool>的注意力。 That way co_continue() does not distract from the fact that it is a generator<bool>.

co_await

这个宏将co_await(sub_coroutine) 转换为:

for t in subroutine
    yield t

这个想法是 coroutine 或 generator 可以等待 sub-coroutine 完成。

yeild_from

此宏将 yield_from(THAT) 表达式转换为:

for t in THAT
    yield t

这个想法是 coroutine 或 generator 可以继续从另一个子 co-routine 或 generator 中产生。

50.4. 顶级协程评估

cr_run(a: Coroutine)

argument

argument type

a

Coroutine

此函数将运行协程,直到完成。

cr_run_all(a: Coroutines)

argument

argument type

a

Coroutines

此函数运行所有协程,直到它们完成。