程序员常刷题CPS -也称为Continuation-Passing Style -用于Nim。在过去的几个月里,观看Nim社区的人可能听说过CPS这个词。似乎对CPS存在一些混淆。具体来说,CPS是什么,不是什么,能做什么,不能做什么。这篇简短的文章试图回答上述问题,并描述了与CPS相关的一些技术细节,以及它如何适应Nim生态系统。注意:档使用术语CPS来表示使用延续的编程风格,并使用Nim-CPS来表示当前正在开发的特定实现。

TL;DR --分钟总结

Nim-CPS是一个转换程序的宏。此转换通过编译指示将单个函数定义作为输入,并产生以下输出:

  • 一个延续类型,通常是一个object,它包含一个函数指针和来自原始函数的任何局部变量。

  • 原始过程中控制流更改之间的每个语句列表的新延续分支函数;这些分支函数被修改为使用延续字段代替局部变量,并且在每个分支的出口处,延续中的函数指针被更新以指向控制流路径中的下一个分支。

  • 一个与原始函数具有相同签名的新便利函数,它实例化了延续类型的新实例。

这种转换后不需要堆栈,这允许一些有趣的可能性。