Имеет ли значение, где сдвиг стоит в блоке сброса? - PullRequest
4 голосов
/ 31 мая 2011

Предположим, есть блок reset с одним shift:

val r = reset { 
   // do smth. 1
   shift {...}
   // do smth. 2
   // do smth. 3
}

Правильно ли ставить shift после слов "сделать что-то 2" или "сделать что-то 3" без изменения результата r? Верно ли, что не имеет значения, где shift стоит в блоке reset?

Ответы [ 2 ]

7 голосов
/ 31 мая 2011

Это сильно зависит от того, что вы делаете в 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.

Надеюсь, это поможет (и я надеюсь, что я правильно понял ваш вопрос)

1 голос
/ 31 мая 2011

Просто добавляя к уже полученному ответу, место, где вы МОЖЕТЕ передвигаться shift, - это наличие кода перед сменой или его внутри функции, которую вы передаете shift:

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

такой же, как

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