Недавно с удивлением узнал, что в Scala есть продолжения (continuations), аналогичные оным в языках Scheme и Ruby. Добавить их можно с помощью специального плагина и флага компилятора.
Продолжения в каком-то роде представляют из себя функциональный аналог goto, позволяя передавать управление вне текущего блока, а потом снова в него возвращаться. Вот так, например, с их помощью можно реализовать простейший итератор в Scala:
reset {Относятся к продолжениям неоднозачно - в JRuby, к примеру, их отказались поддерживать. Незавидная участь, по видимому, ожидает их и в Scala - последнее обновление для соответствующего плагина выходило 2 года назад и даже тогда не было заметно его активного использования в проектах.
def iterate() = shift { f: (Int => Int) =>
println("start")
val x = f(0)
println(s"i $x")
x + 1
}
iterate()
iterate()
iterate()
}
Причина забвения проста - чтобы разобраться в коде с их использованием, нужно приложить значительные усилия. К примеру, попробуйте догадаться, что напечатает в консоль вышеприведённый код.
>>Click here to continue<<