The OpenNET Project / Index page

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



"Энтузиасты создали do-нотацию для C++"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Изначальное сообщение [ Отслеживать ]

"Энтузиасты создали do-нотацию для C++"  +/
Сообщение от opennews (??), 12-Мрт-26, 14:13 
Сообщество энтузиастов написало собственный DSL на макросах, который работает как do-нотация из функциональных языков. Используются продвинутые возможности препроцессора. В представленном проекте реализована новая техника для парсинга DSL, что может поспособствовать созданию дальнейших DSL на препроцессоре C и C++. Код в репозитории написан на C++23 и открыт под лицензией MIT, а сама техника может быть использована и просто в си-препроцессоре...

Подробнее: https://www.opennet.dev/opennews/art.shtml?num=64975

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по времени | RSS]


1. "Энтузиасты создали do-нотацию для C++"  –2 +/
Сообщение от Аноним (-), 12-Мрт-26, 14:13 
> сама техника может быть использована и просто в си-препроцессоре.

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

Ответить | Правка | Наверх | Cообщить модератору

5. "Энтузиасты создали do-нотацию для C++"  +1 +/
Сообщение от Жироватт (ok), 12-Мрт-26, 14:17 
Потому, что могут.
Осталось сделать заголовочник для моноидов и вообще, транспилятор из хаскелла в С, с сохранением монад
Ответить | Правка | Наверх | Cообщить модератору

78. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (78), 12-Мрт-26, 18:07 
Это всё интересно, но статья похожа на демонстрацию какого-то инструмента с рукояткой в розовую полосочку, но совершенно непонятно, что им делать.
Ответить | Правка | Наверх | Cообщить модератору

8. "Энтузиасты создали do-нотацию для C++"  –1 +/
Сообщение от Аноним (8), 12-Мрт-26, 14:22 
Про технику это не про do-нотацию. Там другая техника. Она про то, как посреди произвольного кода вставлять ключевые слова для макросного DSL. И уже на основе этого можно делать другие DSL.
Ответить | Правка | К родителю #1 | Наверх | Cообщить модератору

9. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (8), 12-Мрт-26, 14:27 
(если просто определить макросы напрямую, то парсинг будет сильно ограничен, тогда как с этой техникой оно становится намного гибке)
Ответить | Правка | Наверх | Cообщить модератору

67. "Энтузиасты создали do-нотацию для C++"  +1 +/
Сообщение от Джон Титор (ok), 12-Мрт-26, 16:54 
Это про do-нотацию из Haskell, которая делает монадический код читаемым. Объясню на примерах.
Что такое do-нотация?
В Haskell есть монады — обёртки над значениями (Maybe, Either, IO, список). Чтобы их "разворачивать" последовательно, используют do:
haskell-- Haskell do-notation
result = do
  x <- mx        -- "достать" x из монады
  y <- my        -- "достать" y из монады
  return (x, y)  -- завернуть обратно
Под капотом это разворачивается в цепочку bind (>>=):
haskellresult = mx >>= \x -> my >>= \y -> return (x, y)

Примеры на C (концептуально)
1. Maybe-монада (обработка ошибок без исключений)
c// Тип Maybe
typedef struct {
    bool has_value;
    int value;
} Maybe;

Maybe nothing() { return (Maybe){false, 0}; }
Maybe just(int v) { return (Maybe){true, v}; }

// bind для Maybe
Maybe bind(Maybe m, Maybe (*f)(int)) {
    if (!m.has_value) return nothing();
    return f(m.value);
}

// --- БЕЗ do-нотации ---
Maybe safe_div(int a, int b) {
    return b == 0 ? nothing() : just(a / b);
}

// Вычислить (100 / x) / y  — без DSL это вложенные лямбды/функции
Maybe compute(int x, int y) {
    // В C нет лямбд, поэтому bind превращается в ад указателей на функции
    Maybe mx = safe_div(100, x);
    if (!mx.has_value) return nothing();
    Maybe my = safe_div(mx.value, y);
    if (!my.has_value) return nothing();
    return my;
}

// --- С do-нотацией (псевдокод того, что делает DSL) ---
// DO(
//   LET a IS(safe_div(100, x));
//   LET b IS(safe_div(a, y));
//   return just(b);
// )
// Макрос разворачивает это в правильные проверки автоматически
2. Реальный аналог в C — через goto (классический паттерн)
c// Это фактически ручная do-нотация, которую пишут в C годами:
int process(const char *path) {
    FILE *f = NULL;
    char *buf = NULL;
    int result = -1;

    f = fopen(path, "r");
    if (!f) goto cleanup;          // bind: если нет значения — выход

    buf = malloc(1024);
    if (!buf) goto cleanup;        // bind: следующий шаг

    if (fread(buf, 1, 1024, f) < 0) goto cleanup;

    result = process_buffer(buf);  // return: финальное значение

cleanup:
    free(buf);
    if (f) fclose(f);
    return result;
}
Это буквально то же самое что do-нотация для Maybe/Either — при первой ошибке "выпадаем" из цепочки.
3. Современный C — через макросы (ближе к новости)
c// Упрощённая версия того, что делает описанный DSL:
#define TRY(expr)        \
    ({                   \
        auto _v = (expr);\
        if (!_v.ok) return _v; \
        _v.value;        \
    })

// Result-тип
typedef struct { bool ok; int value; } Result;

Result safe_sqrt(int x) {
    if (x < 0) return (Result){false, 0};
    return (Result){true, (int)sqrt(x)};
}

// С макросом:
Result compute(int a, int b) {
    int x = TRY(safe_sqrt(a));   // если ошибка — функция сразу вернёт ошибку
    int y = TRY(safe_sqrt(b));
    return (Result){true, x + y};
}

Что именно делает описанный DSL
cpp// Это:
auto result = DO(
    LET x IS(mx);
    LET y IS(my);
    return make_value(x, y);
);

// Разворачивается препроцессором в:
auto result = bind(mx, [&](auto x) {
    return bind(my, [&](auto y) {
        return make_value(x, y);
    });
});
Каждый LET a IS(m) становится bind(m, [&](auto a) { ... }), где ... — всё что идёт после. Это вложенные замыкания, сгенерированные макросом.

Почему это интересно
Сложность в том, что макросы C — однопроходные и не имеют состояния, поэтому построить такую "вложенную" структуру из плоского списка LET нетривиально. Описанная техника решает именно эту задачу — трансформацию плоской последовательности в дерево вызовов через препроцессор.
По сути, это то, что Rust решил встроенным ?, а Haskell — do. Только сделано на макросах C/C++.

Ответить | Правка | К родителю #1 | Наверх | Cообщить модератору

81. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (8), 12-Мрт-26, 18:58 
Вот только тут пример лишь с maybe (с ним и корутины справятся неплохо). Но есть ведь и другие монады. Та же монада List. И её тоже можно использовать с этим DSL. С монадами, которые приостанавливают выполнение, немного сложнее, но тоже можно использовать, в репе есть пример с генератором (хотя там и не монады).
Ответить | Правка | Наверх | Cообщить модератору

93. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (8), 12-Мрт-26, 20:06 
Там суть техники не в этом. Тут ещё дело в том, что посреди LET IS может быть произвольный код. Так ещё и WHILE есть с BREAK и CONTINUE, IF-ы.
Ответить | Правка | К родителю #67 | Наверх | Cообщить модератору

10. "Энтузиасты создали do-нотацию для C++"  –4 +/
Сообщение от Аноним (10), 12-Мрт-26, 14:28 
> сама техника может быть использована и просто в си-препроцессоре.

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

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

Ответить | Правка | Наверх | Cообщить модератору

14. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (8), 12-Мрт-26, 14:33 
Техника это не сама do-нотация, а техника парсинга. Чтобы делать другие DSL. Но можно попробовать и do-нотацию сделать попробовать, но там немного другой вид будет (т.к. в си лямбд нет обычно, придется через макросы разбивать на несколько функций и строить цепочки вызовов, так ещё и захваты переменных придётся руками прописывать)
Ответить | Правка | Наверх | Cообщить модератору

26. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (26), 12-Мрт-26, 15:03 
техника парсинга нафиг не нужна, есть ctll на основе шаблонов, а не на осонове макросов, уродующих AST самой программы, в результате чего написано одно, а делает программа другое, потому что шаблоны втихаря воруют исходник и меняют его на подделку.
Ответить | Правка | Наверх | Cообщить модератору

27. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (26), 12-Мрт-26, 15:03 
тфу, не шаблоны, а макросы
Ответить | Правка | Наверх | Cообщить модератору

35. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (8), 12-Мрт-26, 15:26 
Если бы всё было так просто... Шаблоны это, разумеется, хорошо (и в том репозитории они активно применяются), но могут то они далеко не всё. В таком виде (и в целом в юзабельном) do-нотацию на шаблонах не сделать. Там же гибрид шаблонов и макросов.
Ответить | Правка | К родителю #26 | Наверх | Cообщить модератору

47. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (47), 12-Мрт-26, 16:04 
Ого, не знал. У нас на работе как раз используют макросы, нужно будет поручить прекратить это.
Ответить | Правка | К родителю #26 | Наверх | Cообщить модератору

28. "Энтузиасты создали do-нотацию для C++"  –1 +/
Сообщение от Аноним (28), 12-Мрт-26, 15:08 
> А вы предлагаете техники из функциональных языков.

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

Ответить | Правка | К родителю #10 | Наверх | Cообщить модератору

70. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (70), 12-Мрт-26, 17:30 
Да уж куда им, не то что вы, продвинутые - операцию на глаза через опу делаете.
Ответить | Правка | К родителю #10 | Наверх | Cообщить модератору

12. "Энтузиасты создали do-нотацию для C++"  +6 +/
Сообщение от Аноним (12), 12-Мрт-26, 14:33 
> Сообщество энтузиастов

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

Ответить | Правка | Наверх | Cообщить модератору

85. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Сладкая булочка (?), 12-Мрт-26, 19:08 
Это представитель сообщества.
Ответить | Правка | Наверх | Cообщить модератору

13. "Энтузиасты создали do-нотацию для C++"  +4 +/
Сообщение от Аноним (13), 12-Мрт-26, 14:33 
бгг… успешной им отладки! =)
Ответить | Правка | Наверх | Cообщить модератору

17. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (17), 12-Мрт-26, 14:50 
они такого слова не знают! Надо говорить, успешной разгадки! :)
Ответить | Правка | Наверх | Cообщить модератору

39. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (39), 12-Мрт-26, 15:45 
printf() хватит всем.
Ответить | Правка | Наверх | Cообщить модератору

46. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (17), 12-Мрт-26, 16:03 
отладка это процесс!
Ответить | Правка | Наверх | Cообщить модератору

19. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (19), 12-Мрт-26, 14:50 
и что такое bind?
Ответить | Правка | Наверх | Cообщить модератору

20. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (19), 12-Мрт-26, 14:53 
это явно не std::bind
Ответить | Правка | Наверх | Cообщить модератору

21. "Энтузиасты создали do-нотацию для C++"  –1 +/
Сообщение от Аноним (21), 12-Мрт-26, 14:54 
А как определите такое и будет. Можно передавать весь последующий код в DO блоке в функцию как лямбду. Но изначально было придумано для монад. В std::optional bind это тот же and_then. На основе bind можно сделать генераторы, корутины, разные монады (и не только монады).
Ответить | Правка | К родителю #19 | Наверх | Cообщить модератору

24. "Энтузиасты создали do-нотацию для C++"  +3 +/
Сообщение от Аноним (28), 12-Мрт-26, 15:00 
Это чтоб путаться с bind() из libc - биндить сокет к транспортному порту.
Ответить | Правка | К родителю #19 | Наверх | Cообщить модератору

51. "Энтузиасты создали do-нотацию для C++"  –7 +/
Сообщение от Аноним (17), 12-Мрт-26, 16:10 
это просто д*билы позикса используют в именах функций обобщенные многозначные термины (понятия). Там по факту должно было быть нечто bind_socket или socket_bind, лучше sys_socket_bind, что говорит о sys/socket.h.
Ответить | Правка | Наверх | Cообщить модератору

52. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (28), 12-Мрт-26, 16:17 
Кто первый встал, того и тапки. Так что пусть плюсовики меняют имя на std::BindGeneratesAForwardingCallWrapperForAGivenFunctionOrCallableObject()
Ответить | Правка | Наверх | Cообщить модератору

54. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (8), 12-Мрт-26, 16:19 
Проще тогда взять оператор >>= и его переопределить
Ответить | Правка | Наверх | Cообщить модератору

55. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (28), 12-Мрт-26, 16:21 
А если без шуток, и в позиксе *билы, которые используют в именах функций обобщенные многозначные термины (понятия), то кто тогда коммитет плюсовиков, если они делают так же? По факту должно быть std::functional_bind, что говорит о <functional>
Ответить | Правка | К родителю #52 | Наверх | Cообщить модератору

56. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (8), 12-Мрт-26, 16:22 
Так а тут в проекте используется и не std::bind. А другая функция. Там она определяется в неймспейсе doletis. И означает монадическое связывание
Ответить | Правка | Наверх | Cообщить модератору

57. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (28), 12-Мрт-26, 16:24 
почему тогда не doletis_bind()?
Ответить | Правка | Наверх | Cообщить модератору

60. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (21), 12-Мрт-26, 16:30 
Потому что тут C++, а не Си. Там он doletis::bind
Ответить | Правка | Наверх | Cообщить модератору

68. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (28), 12-Мрт-26, 16:55 
а если я использую
using namespace std;
using namespace doletis;
Ответить | Правка | Наверх | Cообщить модератору

82. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (8), 12-Мрт-26, 18:59 
1. Не делайте так
2. Оно обращается через ::doletis::bind, так что код, полученный из макросов, не сломается.
Ответить | Правка | Наверх | Cообщить модератору

91. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (17), 12-Мрт-26, 19:47 
> 1. Не делайте так

это идиотизм, никаких using в помине быть не должно, все должно быть явно и однозначно.

Ответить | Правка | Наверх | Cообщить модератору

73. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (28), 12-Мрт-26, 17:48 
а почему в std:: тогда bind(), а не std::functional_bind()?
Ответить | Правка | К родителю #56 | Наверх | Cообщить модератору

92. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (17), 12-Мрт-26, 19:51 
> Так что пусть плюсовики меняют имя на

Так они обречены писать так, когда два using-а столкнутся :) Суть то не в этом, а в использовании многозначного понятия (понятия приписываемое к разным сущностям) в качестве имени функции или переменного.

Ответить | Правка | К родителю #52 | Наверх | Cообщить модератору

80. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (80), 12-Мрт-26, 18:46 
Это чтоб путаться с bind() из libc

Они там внутри <sys/stat.h> сами себя путают. И struct stat и функция stat(), чтобы запоминать проще было ;)

Ответить | Правка | К родителю #24 | Наверх | Cообщить модератору

40. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (39), 12-Мрт-26, 15:49 
#include <sys/socket.h>
Ответить | Правка | К родителю #19 | Наверх | Cообщить модератору

64. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Rodegast (ok), 12-Мрт-26, 16:43 
> и что такое bind?

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

Ответить | Правка | К родителю #19 | Наверх | Cообщить модератору

66. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (8), 12-Мрт-26, 16:49 
Оно и есть, да
Ответить | Правка | Наверх | Cообщить модератору

25. "Энтузиасты создали do-нотацию для C++"  +4 +/
Сообщение от Аноним (26), 12-Мрт-26, 15:01 
Начнём с того, что за использование макросов без острой на то необходимости и 100% невозможности сделать по-другому с переиспользованием кода (и всяки свистелки  перделки вроде do-нотаци сюда не катят, если не хочешь писать на C++ как на C++, то сиди уже на своей сишке, за си головного мозга, когда на си переизобретают фичи C++ на основе макросов или бойлерплейта кстати тоже надо гнать из профессии) надо гнать из профессии с волчьим билетом. Я прекрасно знаю что ranges недоделаны и ни один компилятор их не умеет оптимизировать, именно поэтому такие фичи должны быть частью ядра языка, а не частью стандартной библиотеки, всё равно новая стандартная библиотека без интринсиков компилятора работать не будет, зачем тогда выпендриваться с шаблонным метапрограммированием, чтобы компиляция была помедленнее и чтобы километровые портянки получать? Такие вещи должны быть first-class citizens языка, разумеется кодить их реализацию надо не на самом языке, а на специальном DSLе, который к сишке имеет такое же отношение, как микрокод процессора (процессоры оказались по сути очень кастрированными FPGA, блин, хотеть полноценный FPGA с полной интеграцией в процессор с полноценной компиляцией программ напрямую в микрокод, а ещё больше хотеть современный аналог трансметы на coarse-grained reconfigurable architecture, где code morphing крутится на арсенид-галлиевом высокоскоростном горячем ядре, а дальше микрооперации через сеть с коммутацией пакетов топологии "звезда" раскидываются по вычислительным блокам на низкой тактовой частоте (но их дохрена параллельных, и по самому тонкому техпроцессу, и к каждому - HBM), но в обычном режиме сеть большую часть времени работает как систолический массив) к машинному коду.
Ответить | Правка | Наверх | Cообщить модератору

30. "Энтузиасты создали do-нотацию для C++"  +3 +/
Сообщение от Аноним (19), 12-Мрт-26, 15:10 
согласен, еще надо unsafe из раст выпилить, не умеешь safe - не берись
Ответить | Правка | Наверх | Cообщить модератору

32. "Энтузиасты создали do-нотацию для C++"  –1 +/
Сообщение от Аноним (-), 12-Мрт-26, 15:14 
> согласен, еще надо unsafe из раст выпилить, не умеешь safe - не берись

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

Ответить | Правка | Наверх | Cообщить модератору

62. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (19), 12-Мрт-26, 16:39 
это был сарказм на предложение выпилить целый язык (препроцессор) из си
Ответить | Правка | Наверх | Cообщить модератору

34. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (8), 12-Мрт-26, 15:23 
Так эта do-нотация и сделана в первую очередь для C++, а на C в таком виде её не сделать (можно сделать в другом). Тут добавлена новая фича в C++, которой раньше в нём не было (корутины достаточно ограничены)
Ответить | Правка | К родителю #25 | Наверх | Cообщить модератору

42. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от аролп5 (?), 12-Мрт-26, 15:56 
В go - горутины
В Kotlin - корутины
В C++ - должны быть сирутины 😁
Ответить | Правка | Наверх | Cообщить модератору

49. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (39), 12-Мрт-26, 16:08 
Сирутины в C.
В C++ - Плюрутины.
Ответить | Правка | Наверх | Cообщить модератору

75. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от никто (??), 12-Мрт-26, 17:54 
срутины
Ответить | Правка | К родителю #42 | Наверх | Cообщить модератору

37. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (39), 12-Мрт-26, 15:39 
Нитрид галлия не быстрее будет?
Ответить | Правка | К родителю #25 | Наверх | Cообщить модератору

89. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (89), 12-Мрт-26, 19:39 
На арсениде галлия технология должна быть отработана, на нём ещё чипы ещё в Cray 3 были.
Ответить | Правка | Наверх | Cообщить модератору

97. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от tkzv (ok), 12-Мрт-26, 20:38 
Вот только внедрение арсенид-галлиевых полупроводников страшно буксует. 40 лет назад всюду трубили, что они скоро сменят кремниевые, но с тех пор наизобретали новых материалов, которые понемногу вытеснили GaAs на 5-е место, если не дальше.
Ответить | Правка | Наверх | Cообщить модератору

33. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (39), 12-Мрт-26, 15:19 
> В представленном проекте реализована новая техника для парсинга DSL, что может поспособствовать созданию дальнейших DSL на препроцессоре C и C++.

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

Ответить | Правка | Наверх | Cообщить модератору

38. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (38), 12-Мрт-26, 15:40 
Вангую что подобные выкрутасы Торвальдс тоже не пропустит. А если надо, то C++ он в ядро пустит. Но спонсоры увидели выгоду только в расте.
Ответить | Правка | Наверх | Cообщить модератору

41. "Энтузиасты создали do-нотацию для C++"  +5 +/
Сообщение от warlock66613email (ok), 12-Мрт-26, 15:55 
Это мегакруто, но я не смог понять в коде почти ни одной строчки.
Ответить | Правка | Наверх | Cообщить модератору

45. "Энтузиасты создали do-нотацию для C++"  +3 +/
Сообщение от Аноним (8), 12-Мрт-26, 15:59 
В понедельник на хабре выйдет статья с разбором этого кода
Ответить | Правка | Наверх | Cообщить модератору

43. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (43), 12-Мрт-26, 15:57 
Перл изобретают
Ответить | Правка | Наверх | Cообщить модератору

69. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Джон Титор (ok), 12-Мрт-26, 16:59 
Да, классика жанра 😄
Perl с его $_, контекстами и цепочками операций — это фактически монадический стиль, просто никто так не называл.
А если смотреть шире — каждое поколение переизобретает одно и то же:

Perl — неявные монады через контекст и $_
Shell pipelines — | это буквально bind для потоков
jQuery — .then().filter().map() — монада над DOM
Promise/async-await — монада над асинхронностью, do-нотация в disguise
Rust ? — монада Either/Result, синтаксический сахар над bind
C макросы — вот это

И каждый раз разработчики говорят "мы не хотим теорию категорий, мы просто хотим удобный синтаксис" — и приходят ровно к тому же месту.
Хаскелисты на это смотрят с тихой улыбкой уже лет 30. 🙂

Ответить | Правка | Наверх | Cообщить модератору

84. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (8), 12-Мрт-26, 19:06 
Так тут прямо как в хаскеле. Можно разные монады брать, а синтаксис один будет. Но тут не только монады можно, а вообще всё, у чего можно вызвать bind
Ответить | Правка | Наверх | Cообщить модератору

48. "Энтузиасты создали do-нотацию для C++"  –1 +/
Сообщение от Анлним (?), 12-Мрт-26, 16:05 
Препроцессор это как goto.
Путает, тяжело разбирать, разводит много хаков которые тяжело проверить.
И это одна из причин почему раст должен умереть.
Ответить | Правка | Наверх | Cообщить модератору

87. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от анон (?), 12-Мрт-26, 19:16 
> Препроцессор это как goto.
> Путает, тяжело разбирать, разводит много хаков которые тяжело проверить.
> И это одна из причин почему раст должен умереть.

Потому что гладиолус или где?
У раста, если че, нет препроцессора.


Ответить | Правка | Наверх | Cообщить модератору

88. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (8), 12-Мрт-26, 19:30 
У раста есть макросы. Которые тоже НЕ имеют доступа к семантике языка. Они пытаются притворяться, что информация об этом у них есть, но они только притворяются. Это всё равно текстоподстановка, ака препроцессор.
Ответить | Правка | Наверх | Cообщить модератору

90. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (89), 12-Мрт-26, 19:42 
Препроцесор на порядки хуже goto. В коде с goto ты хотя-бы код видишь, а в коде с препроцессором #define true (rand() > 10) // happy debugging, suckers!
Ответить | Правка | К родителю #48 | Наверх | Cообщить модератору

61. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Rodegast (ok), 12-Мрт-26, 16:38 
> который работает как do-нотация из функциональных языков

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

Ответить | Правка | Наверх | Cообщить модератору

63. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (8), 12-Мрт-26, 16:42 
В std::optional с C++23 есть монадический интерфейс (and_then), в std::expected тоже. Вот и можно для них использовать do-нотацию. Можно и не только для них и не только для монад. В репе есть пример с генераторами, которые не через монады сделаны, но через do-нотацию.
Ответить | Правка | Наверх | Cообщить модератору

72. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Rodegast (ok), 12-Мрт-26, 17:34 
> В std::optional с C++23 есть монадический интерфейс (and_then), в std::expected тоже

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

Ответить | Правка | Наверх | Cообщить модератору

83. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от ferris (?), 12-Мрт-26, 19:02 
Потому что монады удобные на практике.
Ответить | Правка | Наверх | Cообщить модератору

95. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Rodegast (ok), 12-Мрт-26, 20:13 
> Потому что монады удобные на практике.

Вот только что бы их использовать почему то DSL нужен 😁

Ответить | Правка | Наверх | Cообщить модератору

71. "Энтузиасты создали do-нотацию для C++"  +1 +/
Сообщение от Аноним (70), 12-Мрт-26, 17:32 
Когда функциональщики внезапно поняли что наделали дичи, они изобрели монады. И они молодцы. А те кто монады тянет в си подобные языки, их лечить надо.
Ответить | Правка | Наверх | Cообщить модератору

74. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (74), 12-Мрт-26, 17:52 
Вот, блин, комсомольцы! Сами себе создают трудности, потом преодолевают. Эту шнягу еще сопровождать надо!
Ответить | Правка | Наверх | Cообщить модератору

79. "Энтузиасты создали do-нотацию для C++"  –1 +/
Сообщение от Аноним (79), 12-Мрт-26, 18:07 
> Сами себе создают трудности, потом преодолевают.

Таков путь Си++

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




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

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