impworks / lens

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

Тип "ссылка" #159

Open impworks opened 10 years ago

impworks commented 10 years ago

Бывают моменты, когда хочется передать свойство по ссылке, и компилятор логично не дает этого сделать. Или же, нужно написать код наподобие этого:

if(...)
    SomeType.SomeData += var.Field;
else if (...)
    SomeType.SomeOtherData += var.Field;
else if (...)
    SomeType.YetAnotherData += var.Field;

Для решения обоих вопросов можно было бы добавить стандартный тип, например Ref<T>, хранящий геттер и сеттер с помощью замыканий.

Например, следующий код:

var x = refto SomeType::Value
x = x + 1

Транслировался бы в:

var x = new Ref<int> (-> SomeType::Value) (v -> SomeType::Value = v)
x.Set (x.Get () + 1)
impworks commented 7 years ago

Вариант с сокращенным присваиванием не годится: непонятно, как отличать x от x.Get () - например, при передаче в функцию. Так что оставляет только короткую запись с авто-лямбдами, а методы Get и Set оставляем как есть.

Нужно другое ключевое слово вместо refto - оно слишком близко к ref.

impworks commented 7 years ago

Кстати говоря, в Scala эта концепция называется Lens :)

http://julien-truffaut.github.io/Monocle/