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. Сообщение от Аноним (-), 12-Мрт-26, 14:13   –2 +/
> сама техника может быть использована и просто в си-препроцессоре.

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

Ответить | Правка | Наверх | Cообщить модератору
Ответы: #5, #8, #67

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

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

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

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

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

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

Ответить | Правка | Наверх | Cообщить модератору
Ответы: #14, #28, #70

12. Сообщение от Аноним (12), 12-Мрт-26, 14:33   +7 +/
> Сообщество энтузиастов

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

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

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

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

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

19. Сообщение от Аноним (19), 12-Мрт-26, 14:50   +/
и что такое bind?
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #20, #21, #24, #40, #64, #105

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

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

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

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

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

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

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

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

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

30. Сообщение от Аноним (19), 12-Мрт-26, 15:10   +4 +/
согласен, еще надо unsafe из раст выпилить, не умеешь safe - не берись
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #25 Ответы: #32

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

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #30 Ответы: #62

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

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

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

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

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

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

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

39. Сообщение от Аноним (39), 12-Мрт-26, 15:45   +/
printf() хватит всем.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #17 Ответы: #46

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

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

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

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

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

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

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

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

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

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

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

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

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

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

57. Сообщение от Аноним (28), 12-Мрт-26, 16:24   +/
почему тогда не doletis_bind()?
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #56 Ответы: #60

60. Сообщение от Аноним (21), 12-Мрт-26, 16:30   +/
Потому что тут C++, а не Си. Там он doletis::bind
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #57 Ответы: #68

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

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

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

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

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

64. Сообщение от Rodegast (ok), 12-Мрт-26, 16:43   +/
> и что такое bind?

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #19 Ответы: #66

66. Сообщение от Аноним (8), 12-Мрт-26, 16:49   +/
Оно и есть, да
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #64

67. Сообщение от Джон Титор (ok), 12-Мрт-26, 16:54   +5 +/
Это про 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++.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #1 Ответы: #81, #93

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

69. Сообщение от Джон Титор (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ообщить модератору
Родитель: #43 Ответы: #84

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

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

72. Сообщение от Rodegast (ok), 12-Мрт-26, 17:34   –1 +/
> В std::optional с C++23 есть монадический интерфейс (and_then), в std::expected тоже

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #63 Ответы: #83

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

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

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

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

79. Сообщение от Аноним (79), 12-Мрт-26, 18:07   +/
> Сами себе создают трудности, потом преодолевают.

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

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

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

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

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

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

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

83. Сообщение от ferris (?), 12-Мрт-26, 19:02   +/
Потому что монады удобные на практике.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #72 Ответы: #95

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

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

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

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


Ответить | Правка | Наверх | Cообщить модератору
Родитель: #48 Ответы: #88

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

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

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

91. Сообщение от Аноним (17), 12-Мрт-26, 19:47   –1 +/
> 1. Не делайте так

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

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

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

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

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

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

95. Сообщение от Rodegast (ok), 12-Мрт-26, 20:13   +/
> Потому что монады удобные на практике.

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

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

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

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

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

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

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

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

99. Сообщение от анон (-), 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ообщить модератору
Родитель: #88

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

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

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

101. Сообщение от Аноним83 (?), 13-Мрт-26, 00:09   +/
Нечитабельное и плохо понимабельное.

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

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

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

102. Сообщение от Аноним (102), 13-Мрт-26, 00:59   +/
Я за 10 секунд забил это в чатжпт, он всё быстро и понятно объяснил.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #41

103. Сообщение от Аноним (103), 13-Мрт-26, 03:28   +/
Это отсылка к старой шутке, которую вам не удалось распарсить.

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #17 Ответы: #107

104. Сообщение от Аноним (104), 13-Мрт-26, 05:21   +/
Буксует-то буксует, но настолько же разработанных высокоскоростных альтернатив как не было, так и нет, а тут на каждый такт кремниевой части на диспетчере должна целая процедура отрабатывать, в жёстком реальном времени. Можно делать аппаратно, но аппаратно fine-grained SMT не получить. Как вариант трейдоффа можно и нужно части этой программы, результаты которых не нужны прямо сейчас, выкинуть в кремниевую часть, а на высокоскоростной исполнять только то, что на кремнии не успеет выполниться. Я вообще не уверен в жизнеспособности концепции, это считать надо исходя из размеров пластин, экономики их производства, оценки задержек на сложность программы-диспетчера, конкурентоспособности продукта по сравнению с кластером из существующих решений, я такое делать не умею. По идее чем больше соотношение кремниевых вычислительных блоков к высокоскоростному ядру, тем выше энергоэффективность при той же производительности (можно опускать частоты массива, разменивая задержку на задействованные ядра, а программа на высокоскоростном ядре имеет больше времени поработать, чтобы распланировать более оптимальное распределение микроопераций по блокам), но дороже изделие.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #97

105. Сообщение от Аноним (105), 13-Мрт-26, 05:51    Скрыто ботом-модератором+/
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #19 Ответы: #106

106. Сообщение от Аноним (105), 13-Мрт-26, 05:54   +/
Интерес к функциональным языкам подогревается наличием посредника. Данные пользователю вроде доступны, но могут лежать где угодно. Сущность скрыта.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #105

107. Сообщение от Аноним (28), 13-Мрт-26, 06:39   +/
Аахаха, набашорг! Ржали фсем офисом
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #103

108. Сообщение от Аноним (108), 13-Мрт-26, 08:13   +/
Что за бред?
Ответить | Правка | Наверх | Cообщить модератору


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

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




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

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