170 похожих чатов

Народ у меня есть идея нового пропозала к С++26 -

давайте сделаем С++ expression-first языком. Для этого нужно добавить в язык несколько фич
1) добавить для функции и лямбды синтаксис возрата экспрешена как сахар над return, то есть конструкция "[]() => <expr>" будет сахаром для конструкции "[](){ return <expr>; }"
2) добавить возможность объявлять переменные внутри конструкции скобок. Это уже позволит писать такой код
auto someFunc = []() => (
auto someVar = 123,
someFunc(someVar),
...
someVar
);
Прошу заметить что здесь вместо точки с запятой я использую просто запятую и это валидный синтаксис поскольку в языке уже есть возможность выполнить несколько экспрешенов подряд внутри одного statement например
return (
someFunc(),
anotherFunc(),
someVar = someExpr,
someResult
);
3) добавить возможность использовать конструкцию if-else в выражениях
auto someFunc = []() => (
auto someVar = 123,
if(someCond) someCall(),
auto someResult = if(someCond) (
someVar = someVal,
someFunc()
) else (
anotherFunc()
),
...
someResult
);
либо добавить возможность не указывать вторую часть тенарного оператора
auto someFunc = []() => (
auto someVar = 123,
someCond ? someCall(), //тенарка без двоеточия
someResult
);

4) добавить возможность использовать в выражениях операторы return, break, continue, подобно оператору throw (кстати а вы знали что оператор throw в плюсах можно юзать внутри выражения например "auto obj = flag ? someValue : throw someError" ?) и также добавить возможность использовать в выражениях конструкции for, for-range, while, do-while, switch, try-catch которые будут возвращать значение последнего выражения из своего блока или если был ранних выход оператором break то чтобы можно было вернуть значения используя "break <expr>"

Кому нравится такая идея сделать из C++ красивый функциональный expression-first язык?

30 ответов

117 просмотров

тут нет ничего из того чего нельзя реализовать в С++20 или даже 17

Pasha Manokhin
тут нет ничего из того чего нельзя реализовать в С...

кроме тенарки пожалуй, и пару стилистических фич

Интересно. Только почти всё из этого - breaking changes

Богдан- Автор вопроса
Богдан
а в чем заключается breaking change?

int a = 5, b - это уже валидная запись, предлагается поменять её семантику на (int a = 5), (b)? Тернарник без третьего аргумента должен привести к неоднозначности синтаксиса в битфилдах, но я не могу придумать пример.

Alexander Karaev
int a = 5, b - это уже валидная запись, предлагает...

мне кажется, что пример не придумывается из-за ограничений грамматики http://eel.is/c++draft/class.bit#1

Богдан- Автор вопроса
Alexander Karaev
int a = 5, b - это уже валидная запись, предлагает...

Да, int a = 5, b будет раскрываться в (int a = 5), (b) то есть запрещаем использовать несколько переменных с одним декларатором внутри скобок. Но это не будет breaking-change потому что сейчас вообще нельзя объявлять переменные внутри конструкции круглых скобок

Богдан- Автор вопроса

Кстати с этой фичей когда операторы включая try-catch будут экспрешенами вот такая неудобная конструкция которую приходится писать сейчас auto someResult = [](){ try { return someFunc(); } catch(SomeErr err){ return someDefault(); } }() можно будет удобно записывать вот так auto someResult = try someFunc() catch(SomeErr err) someDefault()

Богдан- Автор вопроса

Ну отличная идея

Богдан- Автор вопроса
Богдан
Кстати с этой фичей когда операторы включая try-ca...

Кстати сейчас действительно есть какая-то странность с try-catch-конструкцией - почему-то она выбивается из синтаксиса остальных операторов в С++ - например с if-оператором можно писать экспрешен сразу без фигурных скобок, то есть такая конструкция работает if(someFlag) x = someFunc(); else x = someDefault(); а вот с try-catch так нельзя try x = someFunc(); catch(SomeErr) x = someDefault();

Итак, в С++ есть тысяча синтаксических способов сделать одно и то же действие, давайте добавим еще тысячу способов, я правильно прочитал?

Я понимаю прелесть унификации, если это не абьюзить bool success = a.find(auto outVar) if (success && auto handle = outVar.get()) { }

Vladimir
Итак, в С++ есть тысяча синтаксических способов сд...

Никто не заставляет их все использовать

Dmitriy [Отпуск]
Нечитаемый ужас родом из С

но это в урезанном варианте уже существует в C++ if (auto pointer_like = get_something()) { // safe to do *pointer_like }

это всё хорошо, но почему бы не взять готовый?

Jokhar Ali
Наоборот, это нововведение

Нововведение - это if (auto p = expr(); p)

Schrödinger's cat
Никто не заставляет их все использовать

Это еще сильнее повышает комплексность языка. На мой взгляд, язык должен продвигать какую-то одну концепцию написания идиоматического кода, а не множить сущее без необходимости. Бесконечное засирание языка новыми конструкциями приводит к тому, что код, решающий задачу, написанный на одном языке, но разными людьми, сильно отличается от человека к человеку, что повышает сложность чтения чужого кода и приводит к замедлению разработки. В итоге суммарное приложение, может к примеру состоять из библиотеки в си стиле, старом коде в c++11 стиле, новом коде в скобочном-запятом стиле. Такими пропоузами язык превращается просто в помойку из конструкций, из которых непонятно, а как, собственно, правильно писать. Мое личное мнение.

Vladimir
Это еще сильнее повышает комплексность языка. На м...

Причина добавления новых фитч не то чтобы "язык раздуть", а чтобы поддержать старые версии кода и к тому же ввести новые фитчи, меняя язык но не нарушая обратной совместимости

Vladislav Vasil'ev
Причина добавления новых фитч не то чтобы "язык ра...

Вот только из того что я понял, автор не предлагает ввести какие-то фичи, а просто добавить новый вариант написания кода, который можно было прекрасно написать и раньше.

Vladimir
Вот только из того что я понял, автор не предлагае...

Я согласен с фактом что эта папира бессмысленна Но я не согласен что "это и раньше можно было написать" должно останавливать прогресс языка

Vladimir
Это еще сильнее повышает комплексность языка. На м...

На мой взгляд, язык должен продвигать какую-то одну концепцию написания идиоматического кода, а не множить сущее без необходимости на мой взгляд, язык в первую очередь должен предоставлять средства для выражения намерений пользователя, а не превращаться в молоток для забивания всего, что похоже на гвоздь

Vladislav Vasil'ev
Я согласен с фактом что эта папира бессмысленна Н...

Я согласен, я имел ввиду что нет смысла менять одну конструкцию на другую аналогичную, но есть смысл менять более сложную конструкцию на более простую.

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
1
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Карта сайта