Functional programming 非竞速行为

Functional programming 非竞速行为,functional-programming,scheme,continuation,Functional Programming,Scheme,Continuation,这是我的密码。当我两次调用continuation时,我希望世界会显示两次。 但它只输出一次。我错过了什么 (define call-with-current-continuation call/cc) (define (repeat arg) (lambda (cc) (cc arg) (cc arg))) (display (call/cc (repeat "world"))) 简短的版本:你捕获的延续比你想象的要大。当scheme评估call/cc时,将继续显示此结

这是我的密码。当我两次调用continuation时,我希望世界会显示两次。 但它只输出一次。我错过了什么

(define call-with-current-continuation call/cc)
(define (repeat arg)
  (lambda (cc)
    (cc arg)
    (cc arg)))

(display (call/cc (repeat "world")))

简短的版本:你捕获的延续比你想象的要大。当scheme评估call/cc时,将继续显示此结果,然后退出程序。因此,对lambda cc arg cc arg主体内的continuation的第一个调用将打印值。。。然后退出程序

要获得所需的行为,您可能需要一个带分隔符的延续,它只捕获延续到顶层的部分。不同的方案实现在分隔连续性的可用性方面有所不同,尽管您可以以牺牲效率为代价以完整连续性的形式实现分隔连续性

例如,Racket有一个带有可组合延续的调用,该调用只切掉延续中到达最近提示的部分。。。每个顶级表达式周围都有一个隐式提示。所以这个节目:

#lang racket

(define (repeat arg)
  (lambda (cc)
    (cc arg)
    (cc arg)))

(display (call-with-composable-continuation (repeat "world")))

正如您所希望的那样,将世界打印两次。

简短版本:您正在捕获的续集比您想象的要大。当scheme评估call/cc时,将继续显示此结果,然后退出程序。因此,对lambda cc arg cc arg主体内的continuation的第一个调用将打印值。。。然后退出程序

要获得所需的行为,您可能需要一个带分隔符的延续,它只捕获延续到顶层的部分。不同的方案实现在分隔连续性的可用性方面有所不同,尽管您可以以牺牲效率为代价以完整连续性的形式实现分隔连续性

例如,Racket有一个带有可组合延续的调用,该调用只切掉延续中到达最近提示的部分。。。每个顶级表达式周围都有一个隐式提示。所以这个节目:

#lang racket

(define (repeat arg)
  (lambda (cc)
    (cc arg)
    (cc arg)))

(display (call-with-composable-continuation (repeat "world")))
正如您所希望的那样,将世界打印两次。

这是意料之中的。cc arg调用转义继续。这是预期的。cc arg调用转义继续。