gpt4 book ai didi

scheme - 帮助动态风和调用/抄送

转载 作者:行者123 更新时间:2023-12-04 17:41:27 24 4
gpt4 key购买 nike

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

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

据我了解, c 将绑定(bind)到在“(显示'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。我错过了什么?

最佳答案

在 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被绑定(bind)到一个延续值——因为你的表达式返回 k作为值(value)。和 k本身是值表达式的延续,这意味着这个延续是等待获取值以绑定(bind)到 c 的延续。 .所以调用它需要一个单一的值,正如 Racket 所要求的,这有助于澄清这里发生的事情(MIT 方案似乎默默地将其视为未指定)。无论如何,在 99 上应用这个延续意味着该表达式的返回值为 99 - 所以你跳回上下文(打印 IN )并返回 99 以绑定(bind)到 c , 并打印 OUT在你出去的路上。您现在已修改 c取而代之的是 99,所以你不能第三次调用它。

关于scheme - 帮助动态风和调用/抄送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3032008/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com