【问题标题】:Help with dynamic-wind and call/cc帮助动态风和呼叫/抄送
【发布时间】:2011-03-03 04:47:29
【问题描述】:

我在理解以下行为时遇到了一些麻烦 方案程序:

(define c
  (dynamic-wind
    (lambda () (display 'IN)(newline))
    (lambda () (call/cc (lambda (k)
                     (display 'X)(newline)
                     k)))
    (lambda () (display 'OUT)(newline))))

据我了解,c 将绑定到在 "(display 'X)" 之前创建的延续。

但使用 c 似乎会修改自己!上面的定义打印(如我所料)IN、X 和 OUT:

IN
X
OUT

这是一个程序:

#;2> c
#<procedure (a9869 . results1678)>

现在,我希望当再次调用它时,会打印 X,但事实并非如此!

#;3> (c)
IN
OUT

现在 c 不再是一个过程,第二次调用 c 将不起作用!

#;4> c    ;; the REPL doesn't answer this, so there are no values returned
#;5> (c)

Error: call of non-procedure: #<unspecified>

        Call history:

        <syntax>            (c)
        <eval>              (c)    <--

我希望对 (c) 的每次调用都会做同样的事情——打印 IN、X 和 OUT。我错过了什么?

【问题讨论】:

    标签: scheme racket continuations


    【解决方案1】:

    在 Racket 中运行它会更有帮助:

    -> (define c
         (dynamic-wind
           (lambda () (display 'IN)(newline))
           (lambda () (call/cc (lambda (k)
                                 (display 'X)(newline)
                                 k)))
           (lambda () (display 'OUT)(newline))))
    IN
    X
    OUT
    -> c
    #<continuation>
    -> (c)
    IN
    OUT
    define-values: context (defining "c") expected 1 value, received 0 values
    -> (c 99)
    IN
    OUT
    -> c
    99
    

    请特别注意c 绑定到一个延续值——因为您的表达式返回k 作为值。而k本身就是值表达式的延续,也就是说这个延续就是等待得到一个值来绑定c。所以调用它需要一个单一的值,正如 Racket 所要求的,这有助于澄清这里发生的事情(MIT 方案似乎默默地将其视为未指定)。无论如何,在 99 上应用此延续意味着该表达式的返回值为 99——因此您跳回上下文(打印 IN)并返回 99 以绑定到 c,并在外出时打印OUT。您现在已将 c 修改为 99,因此您不能第三次调用它。

    【讨论】:

    • 哦,我明白了!现在我觉得这毕竟是一个非常愚蠢的问题。非常感谢!
    • @Eli:“所以你不能第三次调用它”——当然除非你总是调用 (cc),它将 c 绑定到定义 c 的过程的延续...: -)
    • @Jay:你是对的,当然。我专注于 josh 的设置,除了 Racket 需要发送一些值 - 所以使用 c 会使其更加混乱。
    • 嘿,这很有趣...我像上面那样定义了 c,然后在 MzScheme v4.2.4 上调用了 (c) 五次,它就可以工作了。 (?!)它在 Chicken、Guile、Gambit、Ypsilon 和 SISC 上失败。
    • 你的意思是(c) 没有参数?它也应该在 4.2.4 中失败。
    猜你喜欢
    • 2012-02-21
    • 2015-04-23
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多