Scheme call/cc如何从两个子节点跳转

Scheme call/cc如何从两个子节点跳转,scheme,callcc,Scheme,Callcc,我写了一个,它真的可以工作,但我仍然不知道它是如何在子程序之间切换的。 例如: (call/cc (lambda (k) (k 1) (display 2))) 我想应该执行显示过程,但它没有执行 在java中,它是这样的: public class Test { static void call_cc(Consumer<Consumer> k,Consumer current){ k.accept(current); }

我写了一个,它真的可以工作,但我仍然不知道它是如何在子程序之间切换的。 例如:

(call/cc
 (lambda (k)
   (k 1)
   (display 2)))
我想应该执行显示过程,但它没有执行

在java中,它是这样的:

public class Test {

    static void call_cc(Consumer<Consumer> k,Consumer current){
        k.accept(current);
    }

    public static void main(String[] args){
        call_cc(consumer -> {
            consumer.accept(1);
            System.out.println(2);
        },System.out::print);
    }
}
公共类测试{
静态无效呼叫(耗电元件k、耗电元件电流){
k、 接受(当前);
}
公共静态void main(字符串[]args){
呼叫抄送(消费者->{
消费者。接受(1);
系统输出打印ln(2);
},System.out::print);
}
}

那么我的意见有什么问题呢?

调用/cc将程序重写为连续传递方式。我对代码做了一些修改,以显示结果,并在之后添加了一个附加代码,以便您可以了解它,以下是我的修改:

(display (call/cc
 (lambda (k)
   (k 1)
   (display 2))))
(display "finished")
在CPS
call/cc
中,仅此而已:

(define (call/cc& f continuation)
  (define (exit value actual-continuation)
    (continuation value))
  (f exit continuation)
使用exit函数时,会得到一个闭包,表示CPS中程序的其余部分,但它的主要功能是使用它自己的延续,而不是提供的延续

我定义了CPS版本的
display
和最终的延续函数
halt

; CPS version of display
(define (display& s k)
  (display s)
  (k 'undefined))

; The final continuation
; We make the REPL get the result and it display it
(define halt values)
现在来重写代码。CPS将代码更改为一个步骤过程,每个步骤只计算一件事情,而在方案中,评估顺序取决于此表单中的实现,顺序将显示得非常清楚。请注意,它从不返回,只是在尾部位置调用continuations:

; CPS version of the code
(call/cc&
 (lambda (exit continuation)
   (exit 1 
         (lambda (unused)
           (display& 2 continuation))))
 (lambda (value)
   (display& value
             (lambda (unused)
               (display& "finished" halt)))))
现在,如果你一步一步地看,很明显为什么它从不显示“2”