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


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

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

     
     
  • 2.5, Жироватт (ok), 14:17, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Потому, что могут.
    Осталось сделать заголовочник для моноидов и вообще, транспилятор из хаскелла в С, с сохранением монад
     
  • 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 +/
     
     
  • 5.53, Жироватт (ok), 16:17, 12/03/2026 Скрыто ботом-модератором     [к модератору]
  • +/
     
  • 2.67, Джон Титор (ok), 16:54, 12/03/2026 Скрыто ботом-модератором     [к модератору]
  • +/
     

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

    Чего? 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-нотацию на шаблонах не сделать. Там же гибрид шаблонов и макросов.
     
  • 4.47, Аноним (47), 16:04, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Ого, не знал. У нас на работе как раз используют макросы, нужно будет поручить прекратить это.
     
  • 2.28, Аноним (28), 15:08, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > А вы предлагаете техники из функциональных языков.

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

     
  • 2.70, Аноним (70), 17:30, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Да уж куда им, не то что вы, продвинутые - операцию на глаза через опу делаете.
     

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

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

     
     
  • 2.59, Аноним (59), 16:29, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Сообщество было с ним в одном помещении.
     

  • 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() хватит всем.
     
     
  • 4.46, Аноним (17), 16:03, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    отладка это процесс!
     

  • 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 [^] [^^] [^^^] [ответить]  
  • –1 +/
    А как определите такое и будет. Можно передавать весь последующий код в DO блоке в функцию как лямбду. Но изначально было придумано для монад. В std::optional bind это тот же and_then. На основе bind можно сделать генераторы, корутины, разные монады (и не только монады).
     
  • 2.24, Аноним (28), 15:00, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Это чтоб путаться с bind() из libc - биндить сокет к транспортному порту.
     
     
  • 3.51, Аноним (17), 16:10, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • –5 +/
    это просто д*билы позикса используют в именах функций обобщенные многозначные термины (понятия). Там по факту должно было быть нечто bind_socket или socket_bind, лучше sys_socket_bind, что говорит о sys/socket.h.
     
     
  • 4.52, Аноним (28), 16:17, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Кто первый встал, того и тапки. Так что пусть плюсовики меняют имя на std::BindGeneratesAForwardingCallWrapperForAGivenFunctionOrCallableObject()
     
     
  • 5.54, Аноним (8), 16:19, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Проще тогда взять оператор >>= и его переопределить
     
  • 5.55, Аноним (28), 16:21, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    А если без шуток, и в позиксе *билы, которые используют в именах функций обобщенные многозначные термины (понятия), то кто тогда коммитет плюсовиков, если они делают так же? По факту должно быть std::functional_bind, что говорит о <functional>
     
     
  • 6.56, Аноним (8), 16:22, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Так а тут в проекте используется и не std::bind. А другая функция. Там она определяется в неймспейсе doletis. И означает монадическое связывание
     
     
  • 7.57, Аноним (28), 16:24, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    почему тогда не doletis_bind()?
     
     
  • 8.60, Аноним (21), 16:30, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Потому что тут C , а не Си Там он doletis bind... текст свёрнут, показать
     
     
  • 9.68, Аноним (28), 16:55, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    а если я использую using namespace std using namespace doletis ... текст свёрнут, показать
     
  • 2.40, Аноним (39), 15:49, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    #include <sys/socket.h>
     
  • 2.64, Rodegast (ok), 16:43, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    > и что такое bind?

    Вангую что аналог оператора >>=

     
     
  • 3.66, Аноним (8), 16:49, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Оно и есть, да
     

  • 1.25, Аноним (26), 15:01, 12/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +4 +/
    Начнём с того, что за использование макросов без острой на то необходимости и 10... большой текст свёрнут, показать
     
     
  • 2.30, Аноним (19), 15:10, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +2 +/
    согласен, еще надо unsafe из раст выпилить, не умеешь safe - не берись
     
     
  • 3.32, Аноним (-), 15:14, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    > согласен, еще надо unsafe из раст выпилить, не умеешь safe - не берись

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

     
     
  • 4.62, Аноним (19), 16:39, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    это был сарказм на предложение выпилить целый язык (препроцессор) из си
     
  • 2.34, Аноним (8), 15:23, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Так эта do-нотация и сделана в первую очередь для C++, а на C в таком виде её не сделать (можно сделать в другом). Тут добавлена новая фича в C++, которой раньше в нём не было (корутины достаточно ограничены)
     
     
  • 3.42, аролп5 (?), 15:56, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    В go - горутины
    В Kotlin - корутины
    В C++ - должны быть сирутины 😁
     
     
  • 4.49, Аноним (39), 16:08, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Сирутины в 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 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    не позорься, школотрон
     
  • 1.41, warlock66613 (ok), 15:55, 12/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +4 +/
    Это мегакруто, но я не смог понять в коде почти ни одной строчки.
     
     
  • 2.44, Аноним (59), 15:58, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Когда сишники не хотят переходить на раст, то раст переходит в си.
     
     
  • 3.58, warlock66613 (ok), 16:28, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    В Rust как раз нет в явном виде монад и нет do-нотации. Может когда-нибудь и появятся -- я бы этого исключать не стал -- но не в ближайшем будущем.
     
  • 2.45, Аноним (8), 15:59, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +2 +/
    В понедельник на хабре выйдет статья с разбором этого кода
     

  • 1.43, Аноним (43), 15:57, 12/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Перл изобретают
     

  • 1.48, Анлним (?), 16:05, 12/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Препроцессор это как goto.
    Путает, тяжело разбирать, разводит много хаков которые тяжело проверить.
    И это одна из причин почему раст должен умереть.
     
  • 1.50, Аноним (50), 16:09, 12/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    хе хе, растов порвало.
     
  • 1.61, Rodegast (ok), 16:38, 12/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > который работает как do-нотация из функциональных языков

    Там монад нету, зачем им do-нотация?

     
     
  • 2.63, Аноним (8), 16:42, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    В std::optional с C++23 есть монадический интерфейс (and_then), в std::expected тоже. Вот и можно для них использовать do-нотацию. Можно и не только для них и не только для монад. В репе есть пример с генераторами, которые не через монады сделаны, но через do-нотацию.
     
     
  • 3.72, Rodegast (ok), 17:34, 12/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    > В std::optional с C++23 есть монадический интерфейс (and_then), в std::expected тоже

    Зачем в императивном языке со строгой семантикой нужны монады?

     

  • 1.71, Аноним (70), 17:32, 12/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Когда функциональщики внезапно поняли что наделали дичи, они изобрели монады. И они молодцы. А те кто монады тянет в си подобные языки, их лечить надо.
     

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



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

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