Skip to content

续延

Continuation

表示计算余下部分、接收当前结果并产生最终结果的对象。

形式陈述

在表达式某个求值点,续延描述“取得当前结果后剩余的全部计算”。若当前上下文期望一个 A 值并最终产生答案类型 R,可把续延表示为函数 k:AR。续延传递风格(CPS)把每个函数改写为显式接收 k,并以调用 k 代替普通返回。控制算子如 call/cc 可把当前续延重化为一等值;不同系统还区分受限/无界、一次性/可重复调用的续延。

直觉

普通调用栈隐含保存“下一步做什么”;续延把这段未来直接当作数据和函数暴露出来。

例子与边界

表达式 1 + (2 * □) 中,孔处结果 x 的续延可写成 k(x)=1+2x。异常可解释为调用专门的失败续延;回溯则保存并选择多个续延。续延不必等同于物理栈快照:编译器可将其表示为闭包、堆对象或受限控制段。重复调用包含可变状态的续延会重放控制而未必回滚存储。

推论与应用

CPS 用于编译控制流、尾调用、异常、协程、生成器和异步程序,也让求值顺序显式化。续延语义连接操作语义、指称语义与控制逻辑。

参考资料
  • Robert Harper, Practical Foundations for Programming Languages, 2nd ed., Cambridge University Press, 2016,Chs. 27–30, continuations and control。
  • Glynn Winskel, The Formal Semantics of Programming Languages, MIT Press, 1993,Chs. 7–10, continuations and semantic transformations。