关于DrRacket';中保存的连续体的不同输出;s定义窗口和交互窗口

关于DrRacket';中保存的连续体的不同输出;s定义窗口和交互窗口,racket,Racket,我是个新手,我正在尝试使用call/cc。当我在定义窗口中放入以下代码时 对于DrRacket,运行它,然后在交互窗口中键入(saved-k 0),我会打印出3中的两个 #lang racket ; the definitions window (define saved-k #f) (define (f) (+ 1 (call/cc (λ (k) (set! saved-k k) 0)))) (+ 1 (+ 1 (f))) 我的理解是,保存的延续应该是(+1(+1(+1?

我是个新手,我正在尝试使用call/cc。当我在定义窗口中放入以下代码时 对于DrRacket,运行它,然后在交互窗口中键入
(saved-k 0)
,我会打印出
3
中的两个

#lang racket ; the definitions window

(define saved-k #f)

(define (f)
  (+ 1
     (call/cc (λ (k) (set! saved-k k) 0))))

(+ 1 (+ 1 (f)))
我的理解是,保存的延续应该是
(+1(+1(+1?))
其中
是孔。为什么要打印两个结果

当我在交互窗口中尝试所有这些东西时,一切看起来都很正常

; the interactions window
> (define saved-k #f)
> (define (f)
    (+ 1
       (call/cc (λ (k) (set! saved-k k) 0))))
> (+ 1 (+ 1 (f)))
3
> (saved-k 0)
3

Racket在顶层打印值。例如,跑步

#lang racket
1
2
将打印
1
2

这是怎么做到的?当程序运行时,它会将代码扩展为:

(module test racket
  (#%module-begin
   (#%app call-with-values (lambda () '1) print-values)
   (#%app call-with-values (lambda () '2) print-values)))
其中,
打印值
负责打印

程序中发生的情况是,捕获延续时,它包括
打印值
帧。这就是为什么当您调用continuation时,会看到双重打印。一个来自
打印值
。另一个是评价结果

但是,当您在交互式窗口中尝试所有这些值时,没有
打印值
,因此没有重复打印

(module test racket
  (#%module-begin
   (#%app call-with-values (lambda () '1) print-values)
   (#%app call-with-values (lambda () '2) print-values)))