lens icon indicating copy to clipboard operation
lens copied to clipboard

Оператор with

Open impworks opened this issue 12 years ago • 3 comments

Есть мысль запилить новое ключевое слово with, модифицирующее область видимости. Оно позволит в некоторых случаях сократить дублирование кода. Например:

var tmpVar = doSomething ()
var result = tmpVar.One + tmpVar.Two

Можно будет записать так:

var result = with doSomething () do One + Two

После with может идти как выражение, так и имя класса - тогда будут искаться статические методы и свойства. Например, было бы удобно для перечислений:

var opts1 = RegexOptions::Multiline & RegexOptions::Compiled & RegexOptions::IgnoreCase
var opts2 = with RegexOptions do Multiline & Compiled & IgnoreCase

При конфликтах будет выдаваться сообщение об ошибке компиляции. @ForNeVeR, как тебе мысль?

impworks avatar May 22 '13 12:05 impworks

Скажу честно - я был изначально против такого блока. Но в современных языках есть аналог (import в scala, with в JavaScript и в Pascal). К тому же, я обсудил этот вопрос с коллегами, и был шокирован: они рассматривают такое выражение в качестве допустимого аналога блокам инициализации свойств C#. Так что фиче быть.

ForNeVeR avatar May 22 '13 15:05 ForNeVeR

Кстати, отличная идея с инициализатором объекта! Я даже не подумал про нее. Но тут есть один тонкий момент: выражение инициализатора свойств возвращает сам объект, и это удобно, чтобы сразу сохранить его в переменную. Но, например, в случае с enum'ами хочется вернуть значение определенного выражения.

Вариант 1: идти по правилам, всегда возвращать значение последнего элемента блока. Тогда инициализатор должен будет вызываться на переменной:

var kitty = new Cat ()
with kitty do
    Name = "Darla"
    BirthDay = new Date 4 1 2009
    CutenessLevel = 9001

Вариант 2: для возвращения последнего значения использовать другую форму. Мне больше всего понравилось ключевое слово make для этого:

var kitty = with new Cat () do
    Name = "Darla"
    IsCute = true
var result = with kitty make Name.Reverse ()

Вместо make может быть have, return или find - в порядке убывания моего предпочтения.

Чтобы избежать неоднозначности между типом и выражением, можно заюзать уже существующее ключевое слово type:

var mode = with type RegexOptions make CultureInvariant & Multiline & Compiled

impworks avatar May 22 '13 17:05 impworks

Придумал. Можно взять ключевое слово get! Например:

let kitty = with new Cat () do
    Name = "Darla"
    IsCute = true
let result = with kitty get Name.Reverse ()

impworks avatar Jun 08 '13 06:06 impworks