The OpenNET Project / Index page

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

Энтузиасты создали do-нотацию для C++

12.03.2026 13:00 (MSK)

Сообщество энтузиастов написало собственный DSL на макросах, который работает как do-нотация из функциональных языков. Используются продвинутые возможности препроцессора. В представленном проекте реализована новая техника для парсинга DSL, что может поспособствовать созданию дальнейших DSL на препроцессоре C и C++. Код в репозитории написан на C++23 и открыт под лицензией MIT, а сама техника может быть использована и просто в си-препроцессоре.



   // Без DSL:
   auto result = bind(mx, [&](auto x) {
     return bind(my, [&](auto y) {
       return make_value(x, y);
     });
   });
   
   // С DSL:
   auto result = DO(
     LET x IS(mx);
     LET y IS(my);
     return make_value(x, y);
   );


  1. Главная ссылка к новости (https://github.com/j4niwzis/do...)
  2. OpenNews: Выпуск языка программирования Nim 2.2.8
  3. OpenNews: Выпуск компилятора языка D 2.112
  4. OpenNews: Программно-аппаратная платформа CHERIoT 1.0 для повышения безопасности кода на языке Си
  5. OpenNews: Доступен язык программирования OCaml 5.4.0
Автор новости: Аноним
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/64975-cpp
Ключевые слова: cpp, gcc
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (28) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (-), 14:13, 12/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > сама техника может быть использована и просто в си-препроцессоре.

    Поподробнее, как это на си? Функциональщина на си? Это был бы номер, в чемпионате перверсий от айти это было бы где-то в призовых местах :))

     
     
  • 2.5, Жироватт (ok), 14:17, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Потому, что могут.
    Осталось сделать заголовочник для моноидов и вообще, транспилятор из хаскелла в С, с сохранением монад
     
  • 2.8, Аноним (8), 14:22, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Про технику это не про do-нотацию. Там другая техника. Она про то, как посреди произвольного кода вставлять ключевые слова для макросного DSL. И уже на основе этого можно делать другие DSL.
     
     
  • 3.9, Аноним (8), 14:27, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    (если просто определить макросы напрямую, то парсинг будет сильно ограничен, тогда как с этой техникой оно становится намного гибке)
     
     
  • 4.22, Аноним (22), 14:54, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Гибко🤸стрелять🔫себе👨в➡️ноги👣
     

  • 1.10, Аноним (10), 14:28, 12/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    > сама техника может быть использована и просто в си-препроцессоре.

    Чего? do-нотация в СИ?
    Они только недавно в C23 смогли осилить Predefined Boolean constants.

    А вы предлагаете техники из функциональных языков.
    Пожалейте йододефицитных, это ж им мозг сломает))

     
     
  • 2.14, Аноним (8), 14:33, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Техника это не сама do-нотация, а техника парсинга. Чтобы делать другие DSL. Но можно попробовать и do-нотацию сделать попробовать, но там немного другой вид будет (т.к. в си лямбд нет обычно, придется через макросы разбивать на несколько функций и строить цепочки вызовов, так ещё и захваты переменных придётся руками прописывать)
     
     
  • 3.26, Аноним (26), 15:03, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    техника парсинга нафиг не нужна, есть ctll на основе шаблонов, а не на осонове макросов, уродующих AST самой программы, в результате чего написано одно, а делает программа другое, потому что шаблоны втихаря воруют исходник и меняют его на подделку.
     
     
  • 4.27, Аноним (26), 15:03, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    тфу, не шаблоны, а макросы
     
  • 4.35, Аноним (8), 15:26, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Если бы всё было так просто... Шаблоны это, разумеется, хорошо (и в том репозитории они активно применяются), но могут то они далеко не всё. В таком виде (и в целом в юзабельном) do-нотацию на шаблонах не сделать. Там же гибрид шаблонов и макросов.
     
  • 2.28, Аноним (28), 15:08, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    > А вы предлагаете техники из функциональных языков.

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

     

  • 1.12, Аноним (12), 14:33, 12/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    > Сообщество энтузиастов

    1 контрибьютор в репозитории

     
  • 1.13, Аноним (13), 14:33, 12/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    бгг… успешной им отладки! =)
     
     
  • 2.17, Аноним (17), 14:50, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    они такого слова не знают! Надо говорить, успешной разгадки! :)
     
     
  • 3.39, Аноним (39), 15:45, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    printf() хватит всем.
     

  • 1.19, Аноним (19), 14:50, 12/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    и что такое bind?
     
     
  • 2.20, Аноним (19), 14:53, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    это явно не std::bind
     
  • 2.21, Аноним (21), 14:54, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • –2 +/
    А как определите такое и будет. Можно передавать весь последующий код в DO блоке в функцию как лямбду. Но изначально было придумано для монад. В std::optional bind это тот же and_then. На основе bind можно сделать генераторы, корутины, разные монады (и не только монады).
     
  • 2.24, Аноним (28), 15:00, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Это чтоб путаться с bind() из libc - биндить сокет к транспортному порту.
     
  • 2.40, Аноним (39), 15:49, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    #include <sys/socket.h>
     

  • 1.25, Аноним (26), 15:01, 12/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Начнём с того, что за использование макросов без острой на то необходимости и 100% невозможности сделать по-другому с переиспользованием кода (и всяки свистелки  перделки вроде do-нотаци сюда не катят, если не хочешь писать на C++ как на C++, то сиди уже на своей сишке, за си головного мозга, когда на си переизобретают фичи C++ на основе макросов или бойлерплейта кстати тоже надо гнать из профессии) надо гнать из профессии с волчьим билетом. Я прекрасно знаю что ranges недоделаны и ни один компилятор их не умеет оптимизировать, именно поэтому такие фичи должны быть частью ядра языка, а не частью стандартной библиотеки, всё равно новая стандартная библиотека без интринсиков компилятора работать не будет, зачем тогда выпендриваться с шаблонным метапрограммированием, чтобы компиляция была помедленнее и чтобы километровые портянки получать? Такие вещи должны быть first-class citizens языка, разумеется кодить их реализацию надо не на самом языке, а на специальном DSLе, который к сишке имеет такое же отношение, как микрокод процессора (процессоры оказались по сути очень кастрированными FPGA, блин, хотеть полноценный FPGA с полной интеграцией в процессор с полноценной компиляцией программ напрямую в микрокод, а ещё больше хотеть современный аналог трансметы на coarse-grained reconfigurable architecture, где code morphing крутится на арсенид-галлиевом высокоскоростном горячем ядре, а дальше микрооперации через сеть с коммутацией пакетов топологии "звезда" раскидываются по вычислительным блокам на низкой тактовой частоте (но их дохрена параллельных, и по самому тонкому техпроцессу, и к каждому - HBM), но в обычном режиме сеть большую часть времени работает как систолический массив) к машинному коду.
     
     
  • 2.30, Аноним (19), 15:10, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +2 +/
    согласен, еще надо unsafe из раст выпилить, не умеешь safe - не берись
     
     
  • 3.32, Аноним (-), 15:14, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    > согласен, еще надо unsafe из раст выпилить, не умеешь safe - не берись

    Заодно и всю системщину на Rust зарубите как раз. Ну или как вы "safe" допустим адрес в DMA автомат вообще можете загнать? Это вообще - за пределами понимания компилера.

     
  • 2.34, Аноним (8), 15:23, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Так эта do-нотация и сделана в первую очередь для C++, а на C в таком виде её не сделать (можно сделать в другом). Тут добавлена новая фича в C++, которой раньше в нём не было (корутины достаточно ограничены)
     
  • 2.37, Аноним (39), 15:39, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Нитрид галлия не быстрее будет?
     

  • 1.33, Аноним (39), 15:19, 12/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > В представленном проекте реализована новая техника для парсинга DSL, что может поспособствовать созданию дальнейших DSL на препроцессоре C и C++.

    Раз Торвальц не пускает C++ в ядро, то превратим этим способом C в C_with_classes для ядра.

     
     
  • 2.38, Аноним (38), 15:40, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Вангую что подобные выкрутасы Торвальдс тоже не пропустит. А если надо, то C++ он в ядро пустит. Но спонсоры увидели выгоду только в расте.
     

  • 1.36, 12yoexpert (ok), 15:34, 12/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    не позорься, школотрон
     

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



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

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