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


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

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

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

     
  • 1.5, Babylon (?), 16:25, 26/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Эх, помню раньше играл в шутер от мэйла, так чтоб всех побеждать на свою мышку a4tech макрос с трояном скачал с файлопомойки... эх... вину переустанавливал потом, макрос к слову не помог.
     
  • 1.6, Ананоним (?), 16:25, 26/03/2026 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • +/
     
  • 1.7, Аноним (7), 16:45, 26/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Без 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/

     

  • 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.17, Аноним (17), 17:27, 26/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А говорят, что у раст уродливый синтаксис...
     

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



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

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