Scheme “提示/控制”和“移位/复位”之间区别的示例`

Scheme “提示/控制”和“移位/复位”之间区别的示例`,scheme,ml,delimited-continuations,Scheme,Ml,Delimited Continuations,我不确定我是否理解分隔的连续运算符对prompt/control和reset/shift之间的区别。我了解一些基本的用法示例,但在这些示例中,它们的行为是相同的 我在Dariusz Biernacki和Olivier Danvy的“”中找到了这个例子: reset (fn () => shift (fn k => 10 + (k 100)) + shift (fn k’ => 1)) prompt (fn () => control (fn

我不确定我是否理解分隔的连续运算符对
prompt/control
reset/shift
之间的区别。我了解一些基本的用法示例,但在这些示例中,它们的行为是相同的

我在Dariusz Biernacki和Olivier Danvy的“”中找到了这个例子:

reset
  (fn () => shift (fn k => 10 + (k 100))
          + shift (fn k’ => 1))

prompt 
  (fn () => control (fn k => 10 + (k 100))
          + control (fn k’ => 1))
我已将其转换为Scheme,并使用
Racket/control
库在Racket中以预期结果成功运行:

(reset  (+ (shift   k  (+ 10 (k 100)))
           (shift   kk 1))) 
   ;; ==> 11

(prompt (+ (control k  (+ 10 (k 100)))
           (control kk 1))) 
   ;; ==> 1
他们的解释是,

在第一种情况下,当应用
k
时,表达式
shift(fn kk=>1)
在功能上可以表示为
fn v=>100+v
的上下文和可以表示为 表示为
(fn v=>10+v)::nil
;这个上下文被捕获 并丢弃,中间答案为
1
;这个中间体 答案从元上下文插入顶部上下文,即。,
fn v=>10+v
应用于
1
;下一个中间答案是
11
;这是最终的答案,因为元上下文是空的

在第二种情况下,当应用
k
时,表达式控件
(fn kk=>1)
是在合成的上下文中进行计算的
fn v=>10+v
fn v=>100+v
(因此可以 在功能上表示为
fn v=>10+(100+v)
),在 元语境是空的;捕获并丢弃此上下文 中间答案是
1
;这是最后的答案 因为元上下文是空的

我被他们定义为“元上下文”的想法弄糊涂了

直观地说,评估上下文表示计算的剩余部分,直到
最近的封闭分隔符,元上下文表示所有剩余的计算

我不知道这里的“所有剩余计算”是什么意思,我不确定 为什么会是
(fn v=>10+v)::在第一个示例中为nil
(为什么是那段代码?)

我想知道是否还有更多的例子,可能有更多的细节 这两对运算符之间的差异,可能没有太多使用形式语义, 这真是一个让我头疼的问题


编辑:我还看到两个
shift
包围的表达式的顺序确实有所不同:如果我交换它们,那么结果是
control
reset
两个
prompt/control
reset/shift
的缩减规则

(提示val)=>val
(提示E[control k expr])=>(提示((λk.expr)(λv.E[v]))
; E不受提示
(重置值)=>val
(重置E[shift k expr])=>(重置((λk.expr)(λv.(重置E[v]))
; E不需要重置
我们可以看到
reset
prompt
是相同的。然而,第二条规则有着微妙的不同。
reset/shift
对引入了围绕
E[v]
的重置,这限制了
shift
内部
E[v]

现在让我们一步一步地减少这两个表达式

首先,
shift/reduce

(复位(+(移位k(+10(K100)))(移位kk 1)))
=>(重置((λk.(+10(k 100)))(λv.(重置(+v(移位kk 1ЮЮЮ)))
; 这里,E[v]=(+v(移位kk1))
=>(重置((λk.(+10(k 100)))(λv.(重置((λkk.1)(λw.(+v wаааа)))
; 这里,E'[w]=(+vw)
; 由于重置,“E”[w]`只捕获“(+v-w)`
; 马上就被丢弃了。
=>(重置((λk.(+10(k 100)))(λv.(重置1)))
=>(重置((λk.(+10(k 100)))(λv.1)))
=>(重置(+10((λv.1)100)))
=>(重置(+10 1))
=>(重置11)
=> 11
其次,
提示/控制

(提示(+(控件k(+10(K100)))(控件kk 1)))
=>(提示((λk.(+10(k 100)))(λv.(+v(控制kk 1 ')))
; 这里,E[v]=(+v(移位kk1))
=>(提示((λkk.1)(λw.((λk.(+10(k 100)))(λv.(+v w())))
; 这里,E'[w]=((λk.(+10(k 100)))(λv.(+v w)))
; 因为没有`提示','E'[w]`的范围要大得多,而且
; 里面的所有东西都会马上被丢弃
=>(提示1)
=> 1
总之,只有当至少有2个
控制
/
移位
操作符,并且
移位
减少了上下文
E'
可以捕获的范围时,才有区别