Пока IsPartiallyTyped == true, вызов Emit() вызывает ошибку, завивимую от ноды. Вызов метода SetInferredType гасит этот флаг. Проверка будет стоять, как и сейчас, в четырех местах:
Передача аргумента в метод
Присвоение значения в переменную, поле или индекс массива
Приведение значения к типу
Использование аргумента в операторе композиции функций
Кроме того, потребуется особая обработка в инициализаторах коллекций.
Такой подход позволит также разрешить проблему того, что Expand() не может вернуть анонимную функцию с неуказанными типами. Вместо этого нода помечается данным интерфейсом, требует явного указания типа из контекста и возвращает уже типизированную лямбду.
В языке есть несколько элементов, которые не имеют собственного типа и требуют его указания во внешнем контексте:
null
None
вOption<T>
).Сейчас контекст для них разрешается по-разному. Есть смысл унифицировать механизм до единого.
Например, эти ноды реализуют некий интерфейс
IPartiallyTypedNode
:Пока
IsPartiallyTyped == true
, вызовEmit()
вызывает ошибку, завивимую от ноды. Вызов методаSetInferredType
гасит этот флаг. Проверка будет стоять, как и сейчас, в четырех местах:Кроме того, потребуется особая обработка в инициализаторах коллекций.
Такой подход позволит также разрешить проблему того, что
Expand()
не может вернуть анонимную функцию с неуказанными типами. Вместо этого нода помечается данным интерфейсом, требует явного указания типа из контекста и возвращает уже типизированную лямбду.