使用中断程序进行呼叫/抄送

问题描述 投票:0回答:1
(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

scheme chicken-scheme
1个回答
0
投票

你正在做的是创建一个循环:

您可以像这样保存延续:

(define addition
  (lambda (x y)
    (+ x <SLOT>)))

当您调用

(RESUME 1)
时,它会用 1 替换该槽并继续执行代码。下一行是这样的:

(+ x 1)

其余代码位于执行堆栈中:

(print (addition 8 1)
(print (RESUME 1))

然后再次调用resume,因此它会创建9的无限循环。

所以你的延续就像 Goto 语句一样。

© www.soinside.com 2019 - 2024. All rights reserved.