基于Guile Scheme:用shift和reset实现call/cc式提前退出
用shift/reset实现等价于call/cc的提前退出功能
首先要注意,Guile中使用shift和reset需要先加载对应的模块:
(use-modules (ice-9 control))
以下是和你提供的call/cc代码完全等价的shift/reset实现:
(define (my-early-exit) (reset (let ((my-val (shift k (display "this will be executed") (display "\n") (k 5) ;; 提前退出,将5传入捕获到的续延 (display "this will not be executed")))) (display my-val))))
逻辑对应说明:
reset用来划定定界续延的边界,它包裹了从let表达式到display my-val的全部逻辑,这部分就是shift能捕获到的续延范围。shift k会把当前reset范围内的续延(也就是“将my-val绑定后执行(display my-val)”这部分逻辑)捕获并绑定到参数k上。- 调用
(k 5)时,就会直接执行捕获到的续延逻辑(显示5),完全跳过shift后续的display语句,和原call/cc代码的提前退出行为完全一致。
内容的提问来源于stack exchange,提问作者user1632812
相关产品推荐
相关产品推荐

