ideas icon indicating copy to clipboard operation
ideas copied to clipboard

Добавить with <variable> do оператор из старого доброго Паскаля )

Open raidenluikang opened this issue 2 years ago • 5 comments

Вспомнил 20 лет давности : with .. do оператор было адский удобно, для инициализация полей у структур (Record).

Ссылка https://freepascal.org/docs-html/ref/refsu62.html

Почему это идея не дойдет до стандарта? )

Маленький пример,

struct Message
{ 
     int id;
    std::string text;
   std::chrono::steady_clock::time_point delivery;
};

int main(){
    struct Message m;
    with   m do {
          id = 22;
          text = "Hello world";
          delivery = std::chrono::steady_clock::now();
    }
}

Не путайте with оператор у Пайтон, там другая.

raidenluikang avatar Aug 14 '23 19:08 raidenluikang

Существующий синтакс чем хуже ?

Message m {
          .id = 22,
          .text = "Hello world",
          .delivery = std::chrono::steady_clock::now()
    }

sergii-rybin-tfs avatar Aug 14 '23 20:08 sergii-rybin-tfs

Существующий синтакс чем хуже ?

Функции-члены нельзя вызывать, а иногда хочется.

tomilov avatar Aug 14 '23 23:08 tomilov

Существующий синтакс чем хуже ?

Это инициализатор. Во первых инициализирует ВСЕ полей (явно+неявно). Во вторых нужен быть внимателен, нельзя поменять порядок иницилизация переменных как они были объявлены. Во третих те который опустили в иницилизаций , сами иницилизирует дефаултами значениями. Во четвёртых , нелзя мержить несколько структур в одном блоке как with m1, m2 do m1_variable = m2_variable; Во пятых, нельзя добавить другие выражений в блок, например, with m do { int a = calc_something(); m_member_data = a * a * sqrt(a); }

Коротко, это совсем другое.

raidenluikang avatar Aug 16 '23 07:08 raidenluikang

Во первых

Я лишь прошелся по примеру. Что бы изменить язык нужно подобрать подходящий пример который покажет необходимость в новой языковой конструкции.

Как эта фича должна интегрироваться с другими возможностями языка которых не было в паскале. Например ADL и Unqualified name lookup: Из какой области видимости компилятор должен взять calc_something(); при условии что функции с таким именем объявлены везде (включая член класса m) ? А если добавить аргумент с типом из соседнего неймспейса ?

sergii-rybin-tfs avatar Aug 16 '23 10:08 sergii-rybin-tfs

Как эта фича должна интегрироваться с другими возможностями языка которых не было в паскале. Например ADL >> и Unqualified name lookup: Из какой области видимости компилятор должен взять calc_something(); при условии что функции с таким именем >> объявлены везде (включая член класса m) ? А если добавить аргумент с типом из соседнего неймспейса ?

Все это пока открытый вопрос, который надо изучать.

Из себя могу предлагать, что with .. do { } тело with do оператор пусть работает как тело метода указанного объекта, все имена и функция, методы (шаблонный АДЛ МАДЛ) сначала ищут внутри класса, только если не найдётся ищут вне класса.

raidenluikang avatar Aug 17 '23 11:08 raidenluikang