You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Нужно подумать на тему того, как лучше реализовать замыкания. Пока видится два варианта:
Иметь специальный класс, который перестраивает дерево, заменяя обращения к локальной переменной на обращения к полю объекта специального класса.
Иметь специальный класс, который обходит блок кода и помечает переменные как замкнутые, а в коде обращения к переменной будет прописано специальное условие, проверяющее этот флаг.
Первый более общий и более правильный - иметь гибкие механизмы перестраивания дерева кода открыло бы огромные возможности для всяких штук типа yield return или async, второй же вариант проще, хотя класс, отвечающий за обращение к переменным сильно замусорится.
The text was updated successfully, but these errors were encountered:
А мне второй вариант кажется более простым и менее бажным. Там подмена переменной на поле будет производиться в двух местах (get \ set) на уровне IL-кода, и мы ничего не заметим. А в случае с первым есть как минимум шесть различных мест, представленных разными нодами:
a
a.fiield
a[index]
// и еще 3 соответствующих им lvalue
Возможно, есть и другие, которые я навскидку не вспомнил.
У каждой области видимости создается Scope, хранящий информацию о видимых локальных переменных.
Метод Prepare предварительно обходит каждую из функций, включая главную, в поисках лямбда-выражений.
Если хотя бы одно найдено, создается специальный тип с нечитаемым именем, который будет хранить замыкания. Самая лямбда-функция связывается с MethodBuilder для одного из методов этого типа.
Тело лямбды обходится в поисках локальных переменных из внешней области видимости.
Под каждую такую переменную создается поле в closure-классе, и она помечается как замкнутая в своем Scope.
Нужно подумать на тему того, как лучше реализовать замыкания. Пока видится два варианта:
Первый более общий и более правильный - иметь гибкие механизмы перестраивания дерева кода открыло бы огромные возможности для всяких штук типа
yield return
илиasync
, второй же вариант проще, хотя класс, отвечающий за обращение к переменным сильно замусорится.The text was updated successfully, but these errors were encountered: