Информация об изменениях

Сообщение Re[4]: Госспади, отправь на пенсию воспитанников фортрана! от 19.11.2025 6:32

Изменено 19.11.2025 6:53 Doom100500

Re[4]: Госспади, отправь на пенсию воспитанников фортрана!
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, Doom100500, Вы писали:


D>>И это ещё не всё. Потом надо ещё в std-контейнеры переводить. (в шарпе ".ToList()", в плюсах опять begin(), end())


R>Я фигею, тётя Валя, с вашей телепередачи.


R>Во-первых, далеко не всегда финалом вычисления хочется иметь контейнер. А зачастую как раз наоборот — хочется, чтоб все эти контейнеры, коллекции и ренджи вычислились по-ленивому на промежуточных этапах и бесследно испарились в итоге.


В конце цепочки всё равно эти богомерзкие begin()/end()

R>В-третьих, начиная с C++23, у всех стандартных контейнеров есть версии конструкторов, принимающие абстрактные рэнджи, поэтому использовать пару begin-end совсем не обязательно.


До него надо дорасти, спортировать проект (он очень дремучий), и ночать использовать. А пока костылим как можем и тихонько матюкаемся.

R>Ну и в-четвёртых, могу повторить то, что говорил выше
Автор: rg45
Дата: 17.11 17:41
: В С++ ты можешь наопределять себе какого угодно синтаксического сахара самостоятельно:


Это везде можно сделать на любом языке. Вопрос в том, что у кого-то в стандартной библиотеке есть готовые абстракции, а кто-то отпускает это разработчикам. А потом имеем глюки — у каждого свои особенные и неповторимые, причины которых надо искать в тех обёртках, которые кто-то когда-то написал, и все остальные начали использовать. Следовательно, если мы хотим иметь стабилную систему, то для случая, где баг точно воспроизводится — мы напишем другую обёртку, немного отличающуюся от той, которая используется в каждом углу.
Да, тесты могут помочь, но нужно иметь в виду, что большинство "разрабов" срать хотели и на чистоту кода, и на покрытие тестами (а начальству фичи важнее тестов).

R>
R>template <template<typename...> class Container>
R>constexpr auto make = [](std::ranges::range auto&& r) { return Container(std::begin(r), std::end(r)); };
R>


R>И сколько угодно наслаждаться результатами:


R>http://coliru.stacked-crooked.com/a/f9e515b153d86f7c


R>
R>    const std::list list = make<std::list>(nums | filter(even) | map(pow(2)));
R>

R>Здесь можно было спокойно использовать auto, но я специально явно написал std::list, чтоб у тебя не возникало сомнений в том, что сконструировался именно std::list.

В моём компиляторе не компилируется. А значит, пока не внедрили, либо не использовать, либо опять все эти begin()/end().

D>>Даже в шарпе приятнее. Haskel, конечно не догнать, но плюсы — это полный П++.


R>Ну или просто это твои программы на плюсах — полный П++.


Это претензия к "лаконичности" плюсов.
Ну и ещё все эти обязательные return в теле лямбд очень глаза режут и замусоривают код.

Далеко не все плюсовики — независымые разработчики. Есть ещё и те, которые ждут пенсии. Вот ради них и стараемся не писать "непонятно".
Re[4]: Госспади, отправь на пенсию воспитанников фортрана!
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, Doom100500, Вы писали:


D>>И это ещё не всё. Потом надо ещё в std-контейнеры переводить. (в шарпе ".ToList()", в плюсах опять begin(), end())


R>Я фигею, тётя Валя, с вашей телепередачи.


R>Во-первых, далеко не всегда финалом вычисления хочется иметь контейнер. А зачастую как раз наоборот — хочется, чтоб все эти контейнеры, коллекции и ренджи вычислились по-ленивому на промежуточных этапах и бесследно испарились в итоге.


В конце цепочки всё равно эти богомерзкие begin()/end()

R>В-третьих, начиная с C++23, у всех стандартных контейнеров есть версии конструкторов, принимающие абстрактные рэнджи, поэтому использовать пару begin-end совсем не обязательно.


До него надо дорасти, спортировать проект (он очень дремучий), и ночать использовать. А пока костылим как можем и тихонько матюкаемся.

R>Ну и в-четвёртых, могу повторить то, что говорил выше
Автор: rg45
Дата: 17.11 17:41
: В С++ ты можешь наопределять себе какого угодно синтаксического сахара самостоятельно:


Это везде можно сделать на любом языке. Вопрос в том, что у кого-то в стандартной библиотеке есть готовые абстракции, а кто-то отпускает это разработчикам. А потом имеем глюки — у каждого свои особенные и неповторимые, причины которых надо искать в тех обёртках, которые кто-то когда-то написал, и все остальные начали использовать. Следовательно, если мы хотим иметь стабилную систему, то для случая, где баг точно воспроизводится — мы напишем другую обёртку, немного отличающуюся от той, которая используется в каждом углу.
Да, тесты могут помочь, но нужно иметь в виду, что большинство "разрабов" срать хотели и на чистоту кода, и на покрытие тестами (а начальству фичи важнее тестов).

R>
R>template <template<typename...> class Container>
R>constexpr auto make = [](std::ranges::range auto&& r) { return Container(std::begin(r), std::end(r)); };
R>


R>И сколько угодно наслаждаться результатами:


R>http://coliru.stacked-crooked.com/a/f9e515b153d86f7c


R>
R>    const std::list list = make<std::list>(nums | filter(even) | map(pow(2)));
R>

R>Здесь можно было спокойно использовать auto, но я специально явно написал std::list, чтоб у тебя не возникало сомнений в том, что сконструировался именно std::list.

В моём компиляторе не компилируется. А значит, пока не внедрили, либо не использовать, либо опять все эти begin()/end().

D>>Даже в шарпе приятнее. Haskel, конечно не догнать, но плюсы — это полный П++.


R>Ну или просто это твои программы на плюсах — полный П++.


Это претензия к "лаконичности" плюсов.
Ну и ещё все эти обязательные return в теле лямбд очень глаза режут и замусоривают код.

Далеко не все плюсовики — независымые разработчики. Есть ещё и те, которые ждут пенсии. Вот ради них и стараемся не писать "непонятно".

Мне ranges нравятся, есличо. Лаконичности очень даже добавляет.
Меня бесят return в лямбдах, begin/end, обязательные круглые и фигурные скобки в лябдах (опять).

Претензия в примере:

C++:

auto f = [](auto t) {return t *t;};


C#:
var f = t => t*t;