【问题标题】:Using call/cc to make a loop. let vs begin使用 call/cc 进行循环。让 vs 开始
【发布时间】:2013-04-09 12:45:33
【问题描述】:

以下两个代码块(在我看来)都应该是无限循环

这行得通

(define call/cc call-with-current-continuation)

(define l 0)
(define i 0)

((lambda ()
   (call/cc
    (lambda (k)
      (set! l k)))
   (write i)
   (newline)
   (set! i (+ i 1))
   (l "ignore")))

这不起作用:

(define call/cc call-with-current-continuation)

(define l 0)
(define i 0)

(begin
   (call/cc
    (lambda (k)
      (set! l k)))
   (write i)
   (newline)
   (set! i (+ i 1))
   (l "ignore"))

唯一的区别是一个使用 lambda 和一个使用 begin 块。 为什么第二段代码不起作用?

谢谢

【问题讨论】:

    标签: scheme racket continuations callcc


    【解决方案1】:

    在第二种情况下,begin 将其参数拼接到顶层。请注意,有two kinds of begin:如果它在表达式位置,它只是一个接一个地对操作进行排序。第二种(这就是你所拥有的)会将它的所有参数拼接到周围的上下文中。

    拼接的call/cc 表达式的延续实际上是空延续,因为每个顶级表达式都是单独评估的(即,在空延续中)。您可以通过在begin 周围放置let 来检查这一点,这会强制它处于表达式位置。然后它会像你期望的那样无限循环。

    【讨论】:

    • 谢谢!另外,“将其所有参数拼接到周围的上下文中”是什么意思?
    • (begin (begin 1) (begin 2 3) (begin 4)) 将扩展为 (begin 1 2 3 4)。内部开始的内容被“拼接”到外部开始的上下文中。
    猜你喜欢
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    相关资源
    最近更新 更多