cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

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

Open raidenluikang opened 10 months ago

raidenluikang commented 10 months ago

Вспомнил 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 оператор у Пайтон, там другая.

sergii-rybin-tfs commented 10 months ago

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

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

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

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

raidenluikang commented 10 months ago

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

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

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

sergii-rybin-tfs commented 10 months ago

Во первых

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

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

raidenluikang commented 10 months ago

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

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

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