The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Реализация генераторов через макросы на C++

26.03.2026 14:26 (MSK)

Энтузиасты написали генераторы на C++, которые базируются на do-нотации, которая тоже сделана на макросах. Реализация открыта под лицензией MIT.


   // Без do-нотации

   auto result = ::bind(mx, [&](auto&& x) {
     return ::bind(my, [&](auto&& y) {
       return make_value(x + y);
     });
   });

   // С do-нотацией
   auto result = DO(
     LET x IS(mx);
     LET y IS(my);
     return make_value(x + y);
   );

Пример кода с генераторами:


   // Allocation free generators

   constexpr auto my_generator() {
     return GENERATOR((int i), (.i = 0), // или GENERATOR_LOOPHOLES
       YIELD(42);
       WHILE(i != 10) (
         YIELD(i);
         ++i;
       )
       return end<int, 16>();
     );
   }

   static_assert(std::ranges::equal(my_generator(),
                                 std::array{42, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}));

   int main() {
     auto gen = my_generator();
     gen.i = 3;
     std::println("{}", gen);  // prints [42, 3, 4, 5, 6, 7, 8, 9]
     /*
     for (auto i : gen) {
       std::println("{}", i);
     }
     */
   }

С генераторами определяется функция bind и база в виде generator_continuation. Каждый bind теперь работает лениво, а не вычисляет всё сразу. В коде предоставлены 2 версии кода - на базе виртуальных функций и на базе аналога std::variant через технику Type Loopholes для большей производительности.

  1. Главная ссылка к новости (https://habr.com/ru/companies/...)
  2. OpenNews: Энтузиасты создали do-нотацию для C++
Автор новости: Аноним
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/65079-cpp
Ключевые слова: cpp
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (22) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (1), 15:56, 26/03/2026 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • +/
     
  • 1.4, Аноним (4), 16:15, 26/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Если кому надо, то на Habr можно прочитать подробнее про эти генераторы. Про реализацию на лупхолах и реализацию без.

    Там особенно про оптимизацию.

    https://habr.com/ru/companies/timeweb/articles/1006490/

     
  • 1.6, Ананоним (?), 16:25, 26/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Эти лямбда-функции только уродуют язык. Для ленющих погромистов, которым влом было писать имена инлайновых функций по старому стилю.
     
  • 1.7, Аноним (7), 16:45, 26/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    Без do-нотации - набор заклинаний, с do-нотацией - тоже набор заклинаний. А какую задачу решают - неизвестно.
     
     
  • 2.13, Аноним (-), 17:11, 26/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    > А какую задачу решают - неизвестно.

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

     
  • 2.15, Аноним (15), 17:23, 26/03/2026 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > А какую задачу решают - неизвестно.

    Возобновляемые функции.
    Удобно при всяком получении данных.

    Типа
    let records = getRecords(тут твои параметры)


    А дальше ты просто интегрируешь records, пока есть данные. getRecords может отдавать записия скажем по 100, инкапсулируя логику перебора и текущие офсеты.

    К слову, через yield в него еще и передавать значения можно, правда хз зачем, это будет сложно дебажить

    > Без do-нотации - набор заклинаний, с do-нотацией

    Ну так оно и сделанно черт пойми какими костылями тут.

    При нормальной реализации он должен выглядеть как-то так:

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objec

     
     
  • 3.16, Аноним (4), 17:26, 26/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Так есть же статьи на хабр с объяснением работы.

    Про do-нотацию: https://habr.com/ru/companies/timeweb/articles/1003272/
    Про генераторы: https://habr.com/ru/companies/timeweb/articles/1006490/

     
  • 3.27, Bottle (?), 20:55, 26/03/2026 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Хорошо, а как возобновляемые функции помогут тебе на практике?
    Что оно решит? Какие технические расчёты проще написать в do-нотации? Станет ли код от этого быстрее?
    Станет ли написание кода быстрее?
     
     
  • 4.30, Вася Пупкин (?), 23:58, 26/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    "возобновляемые функции" позволяют лаконично отдавать куски данных дальше в следующую часть логики - например обработать и раньше начинать отдавать ответ клиенту потоково. при этом затрачивая меньше оперативы, поскольку не нужно хранить весь итерируемый массив целиком.
     
  • 2.20, Аноним (-), 18:47, 26/03/2026 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Чтобы вручную не выпиливать конечный автомат ты можешь воспользоваться генератором, написать вполне себе императивный код, который из цикла будет выплёвывать значения. Генератор выпилит тебе этот конечный автомат. Или это может быть реализовано как корутина. Но фишка в том, что конечный автомат выпиливать вручную требует заметно больше усилий.

    А если тебе конкретный пример нужен, то можно взять какой-нибудь лексер, который разбирает поток и выплёвывает токены. На вызывающей стороне это выглядит как итератор по токенам, то есть грубо говоря функция next_token, а реализация -- это конечный автомат. Либо ты пишешь его руками, весь этот switch по состояниям, отслеживая переключения между состояниями, либо ты пишешь императивный код, который просто цикл по байтам.

     

  • 1.8, Аноним (8), 16:49, 26/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Сначала был императивный язык, затем поверх навертели функциональный, затем уже поверх него накрутили опять императивный. Цикл замкнулся...
     
  • 1.10, Аноним (10), 17:03, 26/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Сабж в GNU g++ работает?
     
     
  • 2.11, Аноним (4), 17:05, 26/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    В гитхаб репозитории есть CI/CD. Там и показано, что на gcc оно работает. Да и в статье про это написано (нужен g++ 15.2.1 и выше)
     

  • 1.14, Мемоним (?), 17:22, 26/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Можно, а зачем?
     
     
  • 2.18, Аноним (4), 18:36, 26/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Потому что могут. Могут и делают. А на основе этого можно сделать ещё что-нибудь другое.
     

  • 1.17, Аноним (17), 17:27, 26/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    А говорят, что у раст уродливый синтаксис...
     
  • 1.22, Обычный человек (?), 18:54, 26/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Автор писал новость по принципу: "Посмотрите какой я умный, если интересуюсь такими вещами!"
     
  • 1.24, Аноним (24), 19:23, 26/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Выглядит как неграмотная попытка студента в TMP. Велосипедов этих написано несчитанное количество. Штука запутывающая код, вызывающая удивление у анализаторов, IDE и сторонних разработчиков.
    Автор не мог бы быть любезен озвучить свою фамилию чтобы его точно на работу не брать?
    И вообще зачем это здесь?

    Низачот.

     
     
  • 2.26, Аноним (4), 20:02, 26/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Так оно не для прода. В статье так и сказано, что в прод брать не стоит. В статье всё написано.
     

  • 1.25, Аноним (24), 19:59, 26/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Вот разбираешь легаси код в проекте которому больше 10 лет и такие вот "подарки" коллегам частенько попадаются от какого нибудь неумного студентика который давно свалил и вызывает это много негативных эмоций... приходится вычищать разумеется.
     
     
  • 2.29, Аноним (29), 23:17, 26/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    В проектах 30+ лет по стилю кода чувствуешь когда какой функционал появился. Ну и само собой разумеется, стилевой выпендрёж вычищается. Потому что это сложно читать, сложно менять, да и в целом толку мало.
     

  • 1.28, Аноним (28), 21:53, 26/03/2026 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • +/
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2026 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру