4

假设,有reset一个单一的块shift

val r = 重置 {
   // 做某事。1
   转移 {...}
   // 做某事。2
   // 做某事。3
}

shift在 "do smth. 2" 或 "do smth. 3" 之后放置而不改变结果是否正确rshift块中的位置无关紧要是否正确reset

4

2 回答 2

7

这在很大程度上取决于您在shift. 如果您只是像这样调用提供的函数:shift((k: Unit => Unit) => k(Unit))那么,在您的特定示例中,它的位置实际上并不重要shift

Shift函数只是捕获其他函数中的代码(在我的示例中,此函数称为k)。换句话说,这段代码:

val r = reset { 
   // do smth. 1
   shift((k: Unit => Unit) => k(Unit))
   // do smth. 2
   // do smth. 3
}

将由编译器以这样的方式重写(此代码仅演示一般概念,不应该显示编译器插件实际生成的内容):

val k = (Unit => Unit) => {
    // do smth. 2
    // do smth. 3
} 

val r = { 
   // do smth. 1
   k(Unit)
}

但是如果你有一些逻辑shift,比如条件k执行,那么它的位置真的很重要shift

希望这会有所帮助(我希望我能正确理解您的问题)

于 2011-05-30T21:15:31.743 回答
1

只是添加到已经给出的答案,你可以移动的地方shift是在班次之前有代码还是在你传递给的函数内有代码shift

reset { 
  foo(); bar();
  shift { k => stuff }
  baz()
}

是相同的

reset {
  foo();
  shift { k => bar(); stuff }
  baz()
}
于 2011-05-31T00:17:17.557 回答