(define RESUME "ANY THING...")
(define BREAK
(lambda (msg)
(call/cc
(lambda (k)
(set! RESUME k)
((lambda (x) x) msg)))))
(define addition
(lambda (x y)
(+ x (BREAK 7))))
(define main
(lambda args
(print (addition 8 5))
(print (RESUME 1))))
上面的代码一直输出9,就像陷入了无限循环,这是为什么? 根据我的理解,(RESUME 1) 应该只被调用一次。
调用上面的程序如下: CSI -ss 中断.scm
你正在做的是创建一个循环:
您可以像这样保存延续:
(define addition
(lambda (x y)
(+ x <SLOT>)))
当您调用
(RESUME 1)
时,它会用 1 替换该槽并继续执行代码。下一行是这样的:
(+ x 1)
其余代码位于执行堆栈中:
(print (addition 8 1)
(print (RESUME 1))
然后再次调用resume,因此它会创建9的无限循环。
所以你的延续就像 Goto 语句一样。