Это сильно зависит от того, что вы делаете в 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
.
Надеюсь, это поможет (и я надеюсь, что я правильно понял ваш вопрос)