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.me/opennews/art.shtml?num=64975

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

Оглавление

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


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

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

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

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

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

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

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

67. "Энтузиасты создали do-нотацию для C++"  +3 +/
Сообщение от Джон Титор (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++"  +1 +/
Сообщение от Аноним (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++"  –5 +/
Сообщение от Аноним (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++"  +7 +/
Сообщение от Аноним (12), 12-Мрт-26, 14:33 
> Сообщество энтузиастов

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

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

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

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

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

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

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


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

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

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

-
Ну-ну. Хоть бы в доку глянул, но не ... как на опеннете принято: прочитал и додумал, как оно там на самом деле 🤦:
--
However, unlike macros in C and other languages, Rust macros are expanded into abstract syntax trees,
--

Procedural macros allow you to run code at compile time that operates over Rust syntax, both consuming and producing Rust syntax. You can sort of think of procedural macros as functions from an AST to another AST.

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

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

Раст-макросы работают с AST‑деревом, их единственная связь с семантикой - способность сопоставлять группу токенов с конкретным типом мета‑переменной. Токены имеют место происхождения, и этой информации достаточно для гигиеничности.

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

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

98. "Энтузиасты создали do-нотацию для C++"  +/
Сообщение от Аноним (17), 12-Мрт-26, 21:45 
> Препроцесор на порядки хуже goto.

это вообще-то функция текстового редактора :)

> #define true (rand() > 10) // happy debugging, suckers!

Человек это машина, а машина это человек, понимаете?

Ответить | Правка | Наверх | 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++"  +/
Сообщение от Аноним (79), 12-Мрт-26, 18:07 
> Сами себе создают трудности, потом преодолевают.

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

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

101. "Энтузиаст создал do-нотацию для C++"  +/
Сообщение от Аноним83 (?), 13-Мрт-26, 00:09 
Нечитабельное и плохо понимабельное.

Я вот на C для LUA сделал куд более полезный макрос:
LUA_TABLE_FORECH(__L, __IDX)

чтобы по всем элементам таблицы по указанному индексу (относительный или абс) проходится.

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

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

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




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

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