关于DrRacket中call/cc代码输出8144结果的疑问
代码结果8144的产生原因分析
先明确call/cc的核心逻辑:它会捕获当前的续延(continuation)——即call/cc调用完成后后续要执行的所有代码,将其传入r的参数cont。r根据随机值有两个分支:
- 随机到0时,直接返回
1006,程序按正常流程推进 - 随机到1时,调用
(cont 6),直接跳回call/cc的调用位置,把6作为call/cc的返回值,执行之前捕获的续延
以下是8144的具体执行流程:
- 计算第一个乘法表达式
(* (+ (call/cc r) 3) 8):- 执行
(call/cc r),random 2返回1,触发(cont 6) (call/cc r)的结果为6,后续计算(+ 6 3) = 9,再(* 9 8) = 72,第一个乘法结果为72
- 执行
- 计算第二个乘法表达式
(* (+ (call/cc r) 3) 8):- 执行
(call/cc r),random 2返回0,r直接返回1006 - 后续计算
(+ 1006 3) = 1009,再(* 1009 8) = 8072,第二个乘法结果为8072
- 执行
- 外层加法计算:
72 + 8072 = 8144
内容的提问来源于stack exchange,提问作者anru
相关产品推荐
相关产品推荐

