impworks / lens

Language for Embeddable .NET Scripting
MIT License
91 stars 9 forks source link

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

Open impworks opened 10 years ago

impworks commented 10 years ago

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

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

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

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

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

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

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