Хочу прояснить механизм работы меток в языке.
Например есть следующий код:
def a = [1, 2, 3, 4];
def x = x_result: {
foreach(i in a) {
when(i == 3)
x_result(i)
}
0;
}
WriteLine(x);
Если принять к сведению, что foreach — это макрос, разворачивающийся в рекурсивную функцию, — то каким образом происходит передача управления изнутри нее в метку x_result, находящуюся вовне?
Видимо близким аналогом можно считать такой код:
Здравствуйте, hardcase, Вы писали:
H>Похоже что механизм меток контролирует логику переходов уже после того, как произошли все оптимизации хвостовых рекурсий
Ну да, примерно так и есть, от того инлайнится ли функция может зависеть компилируемость block return и yield.
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, hardcase, Вы писали:
H>Похоже что механизм меток контролирует логику переходов уже после того, как произошли все оптимизации хвостовых рекурсий, так как на код вида H>
H>Error: non local goto (block return?) detected
H>
А ведь в принципе такой код можно сделать рабочим, стоит только вспомнить об исключениях.
x_result(i) выбрасывает исключение, а в блоке x_result происходит его перехват — вуаля, мы получаем результат (да здравствует доширак!). Но, конечно, производительность такого подхода будет невысока.
Здравствуйте, hardcase, Вы писали:
H>А ведь в принципе такой код можно сделать рабочим, стоит только вспомнить об исключениях. H>x_result(i) выбрасывает исключение, а в блоке x_result происходит его перехват — вуаля, мы получаем результат (да здравствует доширак!). Но, конечно, производительность такого подхода будет невысока.
И промежуточный catch все испортит. Так, кстати, было сделано в Scala.