作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在理解以下行为时遇到了一些麻烦
方案方案:
(define c
(dynamic-wind
(lambda () (display 'IN)(newline))
(lambda () (call/cc (lambda (k)
(display 'X)(newline)
k)))
(lambda () (display 'OUT)(newline))))
IN
X
OUT
#;2> c
#<procedure (a9869 . results1678)>
#;3> (c)
IN
OUT
#;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) <--
最佳答案
在 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/
我是一名优秀的程序员,十分优秀!