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 |
|
此函数将运行协程,直到完成。
- cr_run_all(a: Coroutines)
argument |
argument type |
---|---|
a |
|
此函数运行所有协程,直到它们完成。