| 1.1, Аноним (-), 14:13, 12/03/2026 [ответить] [﹢﹢﹢] [ · · · ]
| –3 +/– | |
> сама техника может быть использована и просто в си-препроцессоре.
Поподробнее, как это на си? Функциональщина на си? Это был бы номер, в чемпионате перверсий от айти это было бы где-то в призовых местах :))
| | |
| |
| 2.5, Жироватт (ok), 14:17, 12/03/2026 [^] [^^] [^^^] [ответить]
| +5 +/– |
Потому, что могут.
Осталось сделать заголовочник для моноидов и вообще, транспилятор из хаскелла в С, с сохранением монад
| | |
| |
| 3.78, Аноним (78), 18:07, 12/03/2026 [^] [^^] [^^^] [ответить]
| +3 +/– |
Это всё интересно, но статья похожа на демонстрацию какого-то инструмента с рукояткой в розовую полосочку, но совершенно непонятно, что им делать.
| | |
| |
| 4.128, Жироватт (ok), 12:35, 13/03/2026 [^] [^^] [^^^] [ответить]
| +/– |
Интересно, но какой-то куцеватый раздел SupportedTypes
Надо бы поглядеть, какие есть ограничения реально, а не "есть подмножество хаскелла, которое мы можем нормально раскрутить в императивный С"
| | |
|
|
| 2.8, Аноним (8), 14:22, 12/03/2026 [^] [^^] [^^^] [ответить]
| +/– |
Про технику это не про do-нотацию. Там другая техника. Она про то, как посреди произвольного кода вставлять ключевые слова для макросного DSL. И уже на основе этого можно делать другие DSL.
| | |
| |
| 3.9, Аноним (8), 14:27, 12/03/2026 [^] [^^] [^^^] [ответить]
| +/– |
(если просто определить макросы напрямую, то парсинг будет сильно ограничен, тогда как с этой техникой оно становится намного гибке)
| | |
|
| 2.67, Джон Титор (ok), 16:54, 12/03/2026 [^] [^^] [^^^] [ответить]
| +8 +/– |
Это про 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++.
| | |
| |
| 3.81, Аноним (8), 18:58, 12/03/2026 [^] [^^] [^^^] [ответить]
| +1 +/– |
Вот только тут пример лишь с maybe (с ним и корутины справятся неплохо). Но есть ведь и другие монады. Та же монада List. И её тоже можно использовать с этим DSL. С монадами, которые приостанавливают выполнение, немного сложнее, но тоже можно использовать, в репе есть пример с генератором (хотя там и не монады).
| | |
| 3.93, Аноним (8), 20:06, 12/03/2026 [^] [^^] [^^^] [ответить]
| +2 +/– |
Там суть техники не в этом. Тут ещё дело в том, что посреди LET IS может быть произвольный код. Так ещё и WHILE есть с BREAK и CONTINUE, IF-ы.
| | |
| |
| |
| 5.115, Аноним (8), 11:29, 13/03/2026 [^] [^^] [^^^] [ответить]
| +2 +/– |
Так этот код в do_let_is репе мой. Там макросы на порядок сложнее, чем самые примитивные. Там LET ... IS(...) разрезает поток токенов на 2 - ), _LET_IS(..., (...)), _CODE(. Так создаётся список меток. А весь остальной код оказывается в метках _CODE. И потом уже пройтись по всему списку меток через рекурсию и уже разобрать так.
| | |
| |
| 6.118, Джон Титор (ok), 11:46, 13/03/2026 [^] [^^] [^^^] [ответить]
| +/– |
> Так этот код в do_let_is репе мой. Там макросы на порядок сложнее,
> чем самые примитивные. Там LET ... IS(...) разрезает поток токенов на
> 2 - ), _LET_IS(..., (...)), _CODE(. Так создаётся список меток. А
> весь остальной код оказывается в метках _CODE. И потом уже пройтись
> по всему списку меток через рекурсию и уже разобрать так.
А, вы просто хотели дополнить, а не раскритиковать то что написано, ну я вам плюсик поставил.
| | |
| 6.119, Джон Титор (ok), 11:55, 13/03/2026 [^] [^^] [^^^] [ответить]
| +/– |
Я вам рекомендую лучше описывать проект в статье, потому что работы проделано много, а статья маленькая и можно было больше написать - больше примеров, разнообразные варианты использования. Сейчас же есть множество ИИ, которые могут в этом помочь. А то что написано можно как-то по одному воспринимать и какие-то нюансы пропустить. Мы впервые видим этот код и хотим разобраться. Естественно что у многих первое что придёт в голову - скепсис, это нормальная защитная реакция людей. Но вы не волнуйтесь, я вижу что многие люди оценили, просто это реактивное мышление - сначала оно вызывает отторжение что есть что-то новое, что кто-то лучше, потом вызовет принятие, но об этом уже не напишут. Просто тихо будут использовать.
| | |
| |
| 7.127, Аноним (8), 12:32, 13/03/2026 [^] [^^] [^^^] [ответить] | +/– | gt оверквотинг удален Так в понедельник выйдет подробная статья на хабре про в... большой текст свёрнут, показать | | |
|
|
|
|
|
|
| 1.10, Аноним (10), 14:28, 12/03/2026 [ответить] [﹢﹢﹢] [ · · · ]
| –6 +/– | |
> сама техника может быть использована и просто в си-препроцессоре.
Чего? 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.35, Аноним (8), 15:26, 12/03/2026 [^] [^^] [^^^] [ответить]
| +/– |
Если бы всё было так просто... Шаблоны это, разумеется, хорошо (и в том репозитории они активно применяются), но могут то они далеко не всё. В таком виде (и в целом в юзабельном) do-нотацию на шаблонах не сделать. Там же гибрид шаблонов и макросов.
| | |
| 4.47, Аноним (47), 16:04, 12/03/2026 [^] [^^] [^^^] [ответить]
| +/– |
Ого, не знал. У нас на работе как раз используют макросы, нужно будет поручить прекратить это.
| | |
|
|
| 2.28, Аноним (28), 15:08, 12/03/2026 [^] [^^] [^^^] [ответить]
| +2 +/– | |
> А вы предлагаете техники из функциональных языков.
А внутри все равно обычная императивщина - так проц работает, не умеет он в эти твои монады-шмонады. А подобные финты давно в сишке в препроцессоре используются, ты просто йододефицитный и не знаешь об этом.
| | |
| 2.70, Аноним (70), 17:30, 12/03/2026 [^] [^^] [^^^] [ответить]
| +/– |
Да уж куда им, не то что вы, продвинутые - операцию на глаза через опу делаете.
| | |
| 2.111, Аноним (111), 10:23, 13/03/2026 [^] [^^] [^^^] [ответить]
| +1 +/– |
Во-первых, не Си, а Си-плюс-плюс. А во-вторых, Си десятилетиями обходился без "Predefined Boolean constants", а если кто-то без них не может - гнать такого от Си поганой метлой.
| | |
|
| |
| 2.17, Аноним (17), 14:50, 12/03/2026 [^] [^^] [^^^] [ответить]
| +/– |
они такого слова не знают! Надо говорить, успешной разгадки! :)
| | |
| |
| 3.103, Аноним (103), 03:28, 13/03/2026 [^] [^^] [^^^] [ответить]
| +2 +/– | |
Это отсылка к старой шутке, которую вам не удалось распарсить.
#define true (rand() > 10) // Happy debugging, suckers!
| | |
|
|
| |
| 2.21, Аноним (21), 14:54, 12/03/2026 [^] [^^] [^^^] [ответить]
| +/– |
А как определите такое и будет. Можно передавать весь последующий код в 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 [^] [^^] [^^^] [ответить]
| –7 +/– |
это просто д*билы позикса используют в именах функций обобщенные многозначные термины (понятия). Там по факту должно было быть нечто bind_socket или socket_bind, лучше sys_socket_bind, что говорит о sys/socket.h.
| | |
| |
| 4.52, Аноним (28), 16:17, 12/03/2026 [^] [^^] [^^^] [ответить]
| +/– |
Кто первый встал, того и тапки. Так что пусть плюсовики меняют имя на std::BindGeneratesAForwardingCallWrapperForAGivenFunctionOrCallableObject()
| | |
| |
| 5.55, Аноним (28), 16:21, 12/03/2026 [^] [^^] [^^^] [ответить]
| +/– |
А если без шуток, и в позиксе *билы, которые используют в именах функций обобщенные многозначные термины (понятия), то кто тогда коммитет плюсовиков, если они делают так же? По факту должно быть std::functional_bind, что говорит о <functional>
| | |
| |
| 6.56, Аноним (8), 16:22, 12/03/2026 [^] [^^] [^^^] [ответить]
| +/– |
Так а тут в проекте используется и не std::bind. А другая функция. Там она определяется в неймспейсе doletis. И означает монадическое связывание
| | |
| |
| |
| |
| |
| |
| 11.91, Аноним (17), 19:47, 12/03/2026 [^] [^^] [^^^] [ответить] | –1 +/– | это идиотизм, никаких using в помине быть не должно, все должно быть явно и одно... текст свёрнут, показать | | |
|
|
|
|
|
|
| 5.92, Аноним (17), 19:51, 12/03/2026 [^] [^^] [^^^] [ответить]
| +/– | |
> Так что пусть плюсовики меняют имя на
Так они обречены писать так, когда два using-а столкнутся :) Суть то не в этом, а в использовании многозначного понятия (понятия приписываемое к разным сущностям) в качестве имени функции или переменного.
| | |
|
|
| 3.80, Аноним (80), 18:46, 12/03/2026 [^] [^^] [^^^] [ответить]
| +/– | |
Это чтоб путаться с bind() из libc
Они там внутри <sys/stat.h> сами себя путают. И struct stat и функция stat(), чтобы запоминать проще было ;)
| | |
|
| 2.105, Аноним (105), 05:51, 13/03/2026 [^] [^^] [^^^] [ответить]
| +/– | |
>и что такое bind?
Когда Связываешь две сущности через Цепочку действий, которые надо выполнить. В функциональных языках состояние переменной недопустимо (недостижимо), но оно необходимо существует. Есть только опосредованный доступ через функцию.
| | |
| |
| 3.106, Аноним (105), 05:54, 13/03/2026 [^] [^^] [^^^] [ответить]
| +/– |
Интерес к функциональным языкам подогревается наличием посредника. Данные пользователю вроде доступны, но могут лежать где угодно. Сущность скрыта.
| | |
|
|
| 1.25, Аноним (26), 15:01, 12/03/2026 [ответить] [﹢﹢﹢] [ · · · ]
| +7 +/– |
Начнём с того, что за использование макросов без острой на то необходимости и 100% невозможности сделать по-другому с переиспользованием кода (и всяки свистелки перделки вроде do-нотаци сюда не катят, если не хочешь писать на C++ как на C++, то сиди уже на своей сишке, за си головного мозга, когда на си переизобретают фичи C++ на основе макросов или бойлерплейта кстати тоже надо гнать из профессии) надо гнать из профессии с волчьим билетом. Я прекрасно знаю что ranges недоделаны и ни один компилятор их не умеет оптимизировать, именно поэтому такие фичи должны быть частью ядра языка, а не частью стандартной библиотеки, всё равно новая стандартная библиотека без интринсиков компилятора работать не будет, зачем тогда выпендриваться с шаблонным метапрограммированием, чтобы компиляция была помедленнее и чтобы километровые портянки получать? Такие вещи должны быть first-class citizens языка, разумеется кодить их реализацию надо не на самом языке, а на специальном DSLе, который к сишке имеет такое же отношение, как микрокод процессора (процессоры оказались по сути очень кастрированными FPGA, блин, хотеть полноценный FPGA с полной интеграцией в процессор с полноценной компиляцией программ напрямую в микрокод, а ещё больше хотеть современный аналог трансметы на coarse-grained reconfigurable architecture, где code morphing крутится на арсенид-галлиевом высокоскоростном горячем ядре, а дальше микрооперации через сеть с коммутацией пакетов топологии "звезда" раскидываются по вычислительным блокам на низкой тактовой частоте (но их дохрена параллельных, и по самому тонкому техпроцессу, и к каждому - HBM), но в обычном режиме сеть большую часть времени работает как систолический массив) к машинному коду.
| | |
| |
| 2.30, Аноним (19), 15:10, 12/03/2026 [^] [^^] [^^^] [ответить]
| +5 +/– |
согласен, еще надо 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 [^] [^^] [^^^] [ответить]
| +1 +/– |
В go - горутины
В Kotlin - корутины
В C++ - должны быть сирутины 😁
| | |
|
| |
| 3.89, Аноним (89), 19:39, 12/03/2026 [^] [^^] [^^^] [ответить]
| +/– |
На арсениде галлия технология должна быть отработана, на нём ещё чипы ещё в Cray 3 были.
| | |
| |
| 4.97, tkzv (ok), 20:38, 12/03/2026 [^] [^^] [^^^] [ответить]
| +/– |
Вот только внедрение арсенид-галлиевых полупроводников страшно буксует. 40 лет назад всюду трубили, что они скоро сменят кремниевые, но с тех пор наизобретали новых материалов, которые понемногу вытеснили GaAs на 5-е место, если не дальше.
| | |
| |
| 5.104, Аноним (104), 05:21, 13/03/2026 [^] [^^] [^^^] [ответить] | +/– | Буксует-то буксует, но настолько же разработанных высокоскоростных альтернатив к... большой текст свёрнут, показать | | |
|
|
|
| 2.130, Аноним (130), 13:33, 13/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++ он в ядро пустит. Но спонсоры увидели выгоду только в расте.
| | |
| |
| 3.123, Аноним (123), 12:15, 13/03/2026 [^] [^^] [^^^] [ответить]
| –2 +/– |
В линуксе не меньше вирусни чем в винде, хоть user space хоть kernel space
| | |
|
|
| |
| 2.102, Аноним (102), 00:59, 13/03/2026 [^] [^^] [^^^] [ответить]
| –1 +/– |
Я за 10 секунд забил это в чатжпт, он всё быстро и понятно объяснил.
| | |
| |
| 3.116, Аноним (8), 11:32, 13/03/2026 [^] [^^] [^^^] [ответить]
| +/– |
Чатжпт, по моему опыту, не уловливает главную идею кода, но улавливает всё остальное. Если объяснения чатгпт достаточны сразу для того, чтобы написать что-то подобное, то это ладно. А если нет?
| | |
|
|
| |
| 2.69, Джон Титор (ok), 16:59, 12/03/2026 [^] [^^] [^^^] [ответить]
| +/– |
Да, классика жанра 😄
Perl с его $_, контекстами и цепочками операций — это фактически монадический стиль, просто никто так не называл.
А если смотреть шире — каждое поколение переизобретает одно и то же:
Perl — неявные монады через контекст и $_
Shell pipelines — | это буквально bind для потоков
jQuery — .then().filter().map() — монада над DOM
Promise/async-await — монада над асинхронностью, do-нотация в disguise
Rust ? — монада Either/Result, синтаксический сахар над bind
C макросы — вот это
И каждый раз разработчики говорят "мы не хотим теорию категорий, мы просто хотим удобный синтаксис" — и приходят ровно к тому же месту.
Хаскелисты на это смотрят с тихой улыбкой уже лет 30. 🙂
| | |
| |
| 3.84, Аноним (8), 19:06, 12/03/2026 [^] [^^] [^^^] [ответить]
| +1 +/– |
Так тут прямо как в хаскеле. Можно разные монады брать, а синтаксис один будет. Но тут не только монады можно, а вообще всё, у чего можно вызвать bind
| | |
| 3.160, not (??), 10:21, 17/03/2026 [^] [^^] [^^^] [ответить] | +/– | Я подозреваю все названое изобрели авторы с функциональщиной в подкорке, которую... большой текст свёрнут, показать | | |
|
|
| 1.48, Анлним (?), 16:05, 12/03/2026 [ответить] [﹢﹢﹢] [ · · · ]
| –1 +/– |
Препроцессор это как goto.
Путает, тяжело разбирать, разводит много хаков которые тяжело проверить.
И это одна из причин почему раст должен умереть.
| | |
| |
| 2.87, анон (?), 19:16, 12/03/2026 [^] [^^] [^^^] [ответить]
| +1 +/– |
> Препроцессор это как goto.
> Путает, тяжело разбирать, разводит много хаков которые тяжело проверить.
> И это одна из причин почему раст должен умереть.
Потому что гладиолус или где?
У раста, если че, нет препроцессора.
| | |
| |
| 3.88, Аноним (8), 19:30, 12/03/2026 [^] [^^] [^^^] [ответить]
| +1 +/– |
У раста есть макросы. Которые тоже НЕ имеют доступа к семантике языка. Они пытаются притворяться, что информация об этом у них есть, но они только притворяются. Это всё равно текстоподстановка, ака препроцессор.
| | |
| |
| 4.99, анон (-), 22:29, 12/03/2026 [^] [^^] [^^^] [ответить]
| +3 +/– |
> У раста есть макросы. Которые тоже НЕ имеют доступа к семантике языка.
> Они пытаются притворяться, что информация об этом у них есть, но
> они только притворяются. Это всё равно текстоподстановка, ака препроцессор.
-
Ну-ну. Хоть бы в доку глянул, но не ... как на опеннете принято: прочитал и додумал, как оно там на самом деле 🤦:
--
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.
| | |
| |
| 5.112, Аноним (8), 10:46, 13/03/2026 [^] [^^] [^^^] [ответить]
| –1 +/– |
AST в расте это НЕ AST у плюсах. У плюсовых компиляторов в AST есть все типы и прочее. У раста там только синтаксис и ничего более. Они не имеют доступа к типам и нормального доступа к семантике, только к синтаксису
| | |
|
| 4.100, Аноним (-), 23:08, 12/03/2026 [^] [^^] [^^^] [ответить]
| +2 +/– | |
> У раста есть макросы. Которые тоже НЕ имеют доступа к семантике языка. Они пытаются притворяться, что информация об этом у них есть, но они только притворяются. Это всё равно текстоподстановка, ака препроцессор.
Раст-макросы работают с AST‑деревом, их единственная связь с семантикой - способность сопоставлять группу токенов с конкретным типом мета‑переменной. Токены имеют место происхождения, и этой информации достаточно для гигиеничности.
| | |
| |
| 5.113, Аноним (8), 10:48, 13/03/2026 [^] [^^] [^^^] [ответить]
| –1 +/– |
Вот именно. Больше связи с семантикой языка у них никакой. Они не имеют доступа к типам внутри языка. AST в расте это просто синтаксис. AST в плюсах же содержит и типы и всё прочее
| | |
|
| 4.148, Аноним (148), 17:08, 14/03/2026 [^] [^^] [^^^] [ответить]
| +1 +/– | |
> У раста есть макросы
Которые не есть препроцессор. Макросы работают на урове AST, не так как cpp который где-то на уровне замены регекспами.
> Это всё равно текстоподстановка, ака препроцессор.
Результат работы макроса не текст, а AST.
В общем, не надо путать тёплое с мягким. Если ты макросы только в C и видел, и ничего слаще редьки не едал, то сходи и попробуй. Например в Common Lisp'е есть макросы, посмотри на них и оцени разницу. rust'овые макросы не дотягивают, и фишек уровня (eval-when (:compile-toplevel :load-toplevel) ... ) у них нет, но по сути разница упирается в то, что не вся стандартная библиотека rust'а может быть использована для const вычислений.
| | |
| |
| 5.157, Аноним (8), 11:48, 16/03/2026 [^] [^^] [^^^] [ответить]
| –1 +/– |
AST в расте не особо лучше текстом подстановки (немного таки лучше, но лишь немного). Растовый AST содержит только синтаксис, его не стоит сравнивать с плюсовым AST, который содержит и типы и все прочее.
| | |
|
|
|
| 2.90, Аноним (89), 19:42, 12/03/2026 [^] [^^] [^^^] [ответить]
| +1 +/– |
Препроцесор на порядки хуже goto. В коде с goto ты хотя-бы код видишь, а в коде с препроцессором #define true (rand() > 10) // happy debugging, suckers!
| | |
| |
| 3.98, Аноним (17), 21:45, 12/03/2026 [^] [^^] [^^^] [ответить]
| +/– | |
> Препроцесор на порядки хуже goto.
это вообще-то функция текстового редактора :)
> #define true (rand() > 10) // happy debugging, suckers!
Человек это машина, а машина это человек, понимаете?
| | |
|
| 2.125, Аноним (123), 12:21, 13/03/2026 [^] [^^] [^^^] [ответить]
| +/– |
А ведь можно просто разобраться в ООП и DSL и понять что по сути это одно и тоже, и то и то отвечает на вопрос "Что делать?", а не "Как это сделать?", но тут думать нужно ведь
| | |
|
| 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 [^] [^^] [^^^] [ответить]
| –1 +/– |
> В std::optional с C++23 есть монадический интерфейс (and_then), в std::expected тоже
Зачем в императивном языке со строгой семантикой нужны монады?
| | |
| |
| |
| 5.95, Rodegast (ok), 20:13, 12/03/2026 [^] [^^] [^^^] [ответить]
| +1 +/– |
> Потому что монады удобные на практике.
Вот только что бы их использовать почему то DSL нужен 😁
| | |
|
|
|
|
| 1.71, Аноним (70), 17:32, 12/03/2026 [ответить] [﹢﹢﹢] [ · · · ]
| +/– |
Когда функциональщики внезапно поняли что наделали дичи, они изобрели монады. И они молодцы. А те кто монады тянет в си подобные языки, их лечить надо.
| | |
| 1.101, Аноним83 (?), 00:09, 13/03/2026 [ответить] [﹢﹢﹢] [ · · · ]
| +/– | |
Нечитабельное и плохо понимабельное.
Я вот на C для LUA сделал куд более полезный макрос:
LUA_TABLE_FORECH(__L, __IDX)
чтобы по всем элементам таблицы по указанному индексу (относительный или абс) проходится.
| | |
| 1.109, user1985 (?), 09:13, 13/03/2026 [ответить] [﹢﹢﹢] [ · · · ]
| +/– |
"Любая достаточно сложная программа на C или Фортране содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка Common Lisp." Филип Гринспен.
| | |
| |
| 2.135, Аноним (-), 05:36, 14/03/2026 [^] [^^] [^^^] [ответить]
| +/– |
Хочу вас вернуть с небес на грешную землю. Все наши компьютеры имеют структурную и процедурную природу. Язык Си в точности повторяет архитектуру процессора и оперативной памяти. Всё остальное проце-дурщина и ООПэ - это слои абстракции, предназначенные прежде всего для человека, а не для машины. Лисп, как язык был бы хорош если бы работал внутри Лисп-машины. Вот только архитектура Лисп-машин мертва.
| | |
| |
| 3.155, Аноним (-), 08:01, 16/03/2026 [^] [^^] [^^^] [ответить]
| +/– | |
> Язык Си в точности повторяет архитектуру процессора и оперативной памяти.
Оказывается, процессор не может сложить два знаковых числа без UB, строки всегда заканчиваются нулём, а по адресу 0 (NULL) ничего не лежит.
| | |
|
|
| 1.121, Аноним (123), 12:10, 13/03/2026 [ответить] [﹢﹢﹢] [ · · · ]
| +/– |
Откройте для себя ООП в C++ или любом другом ЯП, это и есть DSL с отличной предметной абстракцией
| | |
| |
| 2.136, Илья (??), 06:12, 14/03/2026 [^] [^^] [^^^] [ответить]
| +/– | |
Люди, использующие функциональные абстракции ваше ООП на одном месте вертели.
Вообще, ооп как парадигме нужно дать отдохнуть лет 10.
В современном объектно-ориентированном дотнете, к примеру, уже давно не пишут в стиле "фабрика стратегий абстрактных провайдеров посетителей".
| | |
| |
| 3.137, Аноним (144), 06:28, 14/03/2026 [^] [^^] [^^^] [ответить]
| +1 +/– |
ООП описывает реальный мир, а ФП математическую модель вычислений, так что юзеры давно выбрали что им ближе и проще, сравни любой любой популярный ЯП и условный Хаскель
| | |
| |
| 4.138, nox. (?), 09:04, 14/03/2026 [^] [^^] [^^^] [ответить]
| +1 +/– | |
> ООП описывает реальный мир
Для этого я и упомянул выше классический труд.
| | |
| 4.142, Илья (??), 10:56, 14/03/2026 [^] [^^] [^^^] [ответить]
| +/– | |
> ООП описывает реальный мир, а ФП математическую модель вычислений
две крайности
> так что юзеры давно выбрали что им ближе и проще
чуть-чуть из ооп, чуть-чуть из ФП. Это современный сишарп
| | |
| |
| 5.143, Аноним (144), 11:02, 14/03/2026 [^] [^^] [^^^] [ответить]
| +1 +/– | |
Стандартная библиотека .NET и все его фреймворки состоят из ООП чуть менее чем полностью
Да в ФП есть толковые идеи которые перенимаются с разной степенью кривизны в современные ЯП, но писать на чистом ФП это сродни ананизму
| | |
| |
| 6.145, Илья (??), 11:25, 14/03/2026 [^] [^^] [^^^] [ответить]
| +/– |
> Стандартная библиотека .NET и все его фреймворки состоят из ООП чуть менее
> чем полностью
А что там в стандартной библиотеке? Немного работы с файлами, многопоточкой, строками. Это всё статика. Работа с коллекциями, Linq - функциональщина. Да и всё. Стандартная библиотека не такая и большая
> но писать на чистом ФП это сродни ананизму
И не надо. Не надо писать на JAVA-style ООП. Не надо писать нагромождение монад. Просто пишешь на ванилла сишарп и твой хорошо читается код как нейросетями, так и людьми
| | |
| |
| 7.153, Аноним (153), 15:03, 15/03/2026 [^] [^^] [^^^] [ответить]
| +/– | |
> Стандартная библиотека не такая и большая
наивный Чебурашка :)) Как раз фрэймворк ОГРОМНЫЙ, сродни Смоллтоковской среде. Посмотри, сколько всего понаписякано для .NET Core 10. У меня из сторонних либ только BLToolkit, шифрование, да пара самописных библиотечек. .NET покрывает практически все потребности, включая гуйню и базы.
| | |
|
|
|
|
|
|
| 1.126, Аноним (8), 12:22, 13/03/2026 [ответить] [﹢﹢﹢] [ · · · ]
| –1 +/– | |
> Энтузиаст
А ничего, что это делали несколько, просто в репозитории один контрибьютор?
| | |
| |
| |
| 3.158, Аноним (8), 11:52, 16/03/2026 [^] [^^] [^^^] [ответить]
| +/– |
Один чел помог с GENERATOR_LOOPHOLES, конкретно дал идею использовать лупхолы для сбора используемых типов и помог с реализацией добавления типа в множество и потом считывание множества. Остальное уже дело рук j4niwzis (все макросы и т.д.)
| | |
|
|
| 1.151, Мистер Булкин (ok), 01:20, 15/03/2026 [ответить] [﹢﹢﹢] [ · · · ]
| +/– |
Лучше бы добавили do { body1 } while (condition) { body2 }, который на каждой итерации выполняет body1, далее проверяет условие, если ложь, то выходит из конструкции, а если истина, выполняет body2 и переходит на следующую итерацию.
| | |
| 1.152, Аноним (153), 14:58, 15/03/2026 [ответить] [﹢﹢﹢] [ · · · ]
| +/– |
Чем бы ни маялись, лишь бы Nemerle не использовать! :) Это .NET язык, который ПОЛНОСТЬЮ написан на макросах. Другими словами, он настолько гибок, что только чёрта лысого там нельзя сделать!
| | |
|