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 обязательно


Обсуждение (19) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (1), 15:56, 26/03/2026 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • –2 +/
     
  • 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 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Без do-нотации - набор заклинаний, с do-нотацией - тоже набор заклинаний. А какую задачу решают - неизвестно.
     
     
  • 2.13, Аноним (-), 17:11, 26/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    > А какую задачу решают - неизвестно.

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

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

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

    Типа
    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/

     
  • 2.20, Аноним (-), 18:47, 26/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Чтобы вручную не выпиливать конечный автомат ты можешь воспользоваться генератором, написать вполне себе императивный код, который из цикла будет выплёвывать значения. Генератор выпилит тебе этот конечный автомат. Или это может быть реализовано как корутина. Но фишка в том, что конечный автомат выпиливать вручную требует заметно больше усилий.

    А если тебе конкретный пример нужен, то можно взять какой-нибудь лексер, который разбирает поток и выплёвывает токены. На вызывающей стороне это выглядит как итератор по токенам, то есть грубо говоря функция 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.19, Аноним (19), 18:36, 26/03/2026 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • +1 +/
     
  • 1.21, Обычный человек (?), 18:52, 26/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Автор писал новость написана по принципу: "Посмотрите какой я умный, если интересуюсь такими вещами!"
     
     
  • 2.23, Обычный человек (?), 18:55, 26/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    del
     

  • 1.22, Обычный человек (?), 18:54, 26/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Автор писал новость по принципу: "Посмотрите какой я умный, если интересуюсь такими вещами!"
     

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



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

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