【问题标题】:A tricky question in scheme continuation definition方案延续定义中的一个棘手问题
【发布时间】:2022-06-11 03:41:20
【问题描述】:

R5rs 说

延续代表计算的整个(默认)未来”。

所以基本上在下面的代码中:

(define x (call/cc (lambda (c) c)))
(display "hello\n")
(display "world\n")
(x 4)
(display x)

我尝试了几个实现,都输出了

hello
world
4

在这个例子中,call/cc 捕获的延续似乎只限制了第一个顶级表达式的范围。喜欢(define x ?)

我虽然基于r5rs,但是当(x 4)被执行时,执行会跳回到开始的定义形式,完成赋值。然后它将继续运行随后的两个显示表达式并运行(x 4),这将报告错误,因为 x 将不再是一个过程。

【问题讨论】:

  • 如果你捕获了栈上最外层表达式和定义的序列,这意味着每个捕获的延续都会在你恢复它的那一刻重新启动程序,你不希望这样。无论如何,运行方案的最顶层没有空堆栈,而是包含关闭延续的堆栈。我认为你应该继续使用方案,如果你觉得你的问题有些“棘手”,你应该继续使用,你会单独澄清这类问题。
  • 我相信那句话后面有一个隐含的“捕获它的表达式”。

标签: scheme continuations


【解决方案1】:

您的期望是正确的。问题是 REPL 分别执行每个表达式,就好像您在每个表达式之间按了 ENTER 一样。如果将它们包装在 begin 中,它会按预期工作。

$ scheme
Chez Scheme Version 9.5.8
Copyright 1984-2022 Cisco Systems, Inc.

> (begin
   (define x (call/cc (lambda (c) c)))
   (display "hello\n")
   (display "world\n")
   (x 4)
   (display x))
hello
world
hello
world
Exception: attempt to apply non-procedure 4
Type (debug) to enter the debugger.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多