python - 是否可以在独立的 C 中实现 Python yield 功能?

标签 python c asynchronous yield

我最近在 Python(以及 JavaScript)中遇到了 yield 关键字 - 我知道这主要用于生成器模式,但语言结构似乎用于异步函数我的兴趣所在。在异步函数中,它可能仅充当语法糖,我知道有其他模式可以实现相同的效果 - 但我喜欢它 - 非常喜欢!

我想知道我是否可以在 C 中做类似的事情(即使使用内联汇编)。我遇到了一个使用线程的 Java 实现 https://github.com/mherrmann/java-generator-functions我或多或少可以在 C 中实现。但是,这不是一个独立的实现,我的兴趣纯粹是一个独立的实现。

对于 C 协程 (http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html),缺陷之一是无法使用堆栈对象。但是我对此仍然没问题,因为当前的异步回调实现也不能使用堆栈。然而,问题在于独立的实现 - 我想不出一种方法来收集所有寄存器变量并在没有托管环境的情况下存储它们。

可能有一个使用 setjmp/longjmp 的解决方案,但我很确定这些不能独立实现。

所以问题是:是否可以在 freestanding C 中实现 Python yield 功能?

就我个人而言,我认为我已经用尽了所有可能性,所以我会问这个问题 - 如果您可以进行托管实现,您将如何实现(最好使用一些宏魔法)?我有一个相当丑陋的实现,如果没有什么好东西的话,我会在稍后发布。

此外,我不想要 C++ 实现 - 除非您可以使用纯 C 函数环绕 C++。

编辑:一个基本要求是生成器函数必须是可重入的。

最佳答案

忽略特定语言的行话,您正在寻找的是所谓的“协程”。 Simon Tatham 想出了一些看起来和行为都非常像带有一些预处理器魔法的协程的东西。它并不完全以相同的方式工作,但它假装以对大多数情况有用的方式工作。

参见 here了解全部详情。

根据您的具体问题,这可能就足够了,也可能不够。无论如何,这种方法的优点是它适用于标准 C;不需要非标准编译器。

关于python - 是否可以在独立的 C 中实现 Python yield 功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30399175/

相关文章:

c - 无法使用 libcurl 将 HTTP PUT 发送到 django-piston

C 链表条件语句

asp.net-mvc - 从 Session_Start 调用异步方法

mysql - 如何多次循环 MYSQL 查询并从 Node.js 中的每个循环查询返回数据?

c# - 在 Monotouch 中下载多个文件的推荐模式(异步/多线程)

python - 随机字典排序

c# - 使用 C# dll 的 Pythonnet 运行时错误(数据库不兼容)

python - 如何从元组列表形成字典?

python - 如何解析Python语法?

c - strcat 段错误