关于DrRacket';中保存的连续体的不同输出;s定义窗口和交互窗口
我是个新手,我正在尝试使用call/cc。当我在定义窗口中放入以下代码时 对于DrRacket,运行它,然后在交互窗口中键入关于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?
(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)))