Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
raidenluikang opened this issue Aug 14, 2023 · 5 comments

Comments

@raidenluikang
Copy link

raidenluikang commented Aug 14, 2023

Вспомнил 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
Copy link

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

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

@tomilov
Copy link

tomilov commented Aug 14, 2023

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

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

@raidenluikang
Copy link
Author

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

Это инициализатор. Во первых инициализирует ВСЕ полей (явно+неявно). Во вторых нужен быть внимателен, нельзя поменять порядок иницилизация переменных как они были объявлены. Во третих те который опустили в иницилизаций , сами иницилизирует дефаултами значениями. Во четвёртых , нелзя мержить несколько структур в одном блоке как 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
Copy link

Во первых

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

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

@raidenluikang
Copy link
Author

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

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants