В настоящее время я смотрю на реализацию закрытия на разных языках. Однако, когда дело доходит до Scala, я не могу найти документацию о том, как замыкание сопоставляется с объектами Java.
Хорошо документировано, что функции Scala отображаются на объекты FunctionN. Я предполагаю, что ссылка на свободную переменную закрытия должна храниться где-то в этом объекте функции (как это сделано в С++ 0x, например).
Я также пробовал компилировать следующие с помощью scalac, а затем декомпилировать файлы классов с помощью JD:
object ClosureExample extends Application {
def addN(n: Int) = (a: Int) => a + n
var add5 = addN(5)
println(add5(20))
}
В декомпилированных источниках я вижу анонимный подтип Function1, который должен быть моим закрытием. Но метод apply() пуст, а анонимный класс не имеет полей (которые потенциально могут хранить переменные замыкания). Я полагаю, что декомпилятор не смог получить интересную часть из файлов классов...
Теперь на вопросы:
- Знаете ли вы, как это делается точно?
- Вы знаете, где это задокументировано?
- Есть ли у вас другая идея, как я могу решить эту тайну?