4

reset単一のブロックがあるとしますshift:

val r = リセット {
   // スムーズに実行します。1
   シフト {...}
   // スムーズに実行します。2
   // スムーズに実行します。3
}

shift「do smth. 2」または「do smth. 3」の後に、結果を変更せずに配置するのは正しいrですか? ブロック のどこにshift立っているかは問題ではないというのは正しいですか。reset

4

2 に答える 2

7

で何を作成しているかに大きく依存しますshift。提供された関数を次のように呼び出すだけの場合shift((k: Unit => Unit) => k(Unit))、特定の例では、どこに立っているかは問題ではありませんshift

Shiftfunction は、他の関数でその後に続くコードをキャプチャするだけです (私の例では、この関数は と呼ばれ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 に答える