impworks/lens

Интерфейс контекстно-зависимой типизации

Opened this issue · 0 comments

В языке есть несколько элементов, которые не имеют собственного типа и требуют его указания во внешнем контексте:

  • Литерал null
  • Лямбда-функция с опущенными типами аргументов
  • Скоро добавится метка обобщенного типа, не имеющая связанного объекта ( как None в Option<T>).

Сейчас контекст для них разрешается по-разному. Есть смысл унифицировать механизм до единого.

Например, эти ноды реализуют некий интерфейс IPartiallyTypedNode:

interface IPartiallyTypedNode
{
    bool IsPartiallyTyped { get; }
    void SetInferredType(Type type);
}

Пока IsPartiallyTyped == true, вызов Emit() вызывает ошибку, завивимую от ноды. Вызов метода SetInferredType гасит этот флаг. Проверка будет стоять, как и сейчас, в четырех местах:

  • Передача аргумента в метод
  • Присвоение значения в переменную, поле или индекс массива
  • Приведение значения к типу
  • Использование аргумента в операторе композиции функций

Кроме того, потребуется особая обработка в инициализаторах коллекций.

Такой подход позволит также разрешить проблему того, что Expand() не может вернуть анонимную функцию с неуказанными типами. Вместо этого нода помечается данным интерфейсом, требует явного указания типа из контекста и возвращает уже типизированную лямбду.