Andrew
там сишечка, чего хотеть
Square
Там ansi c и колбэки на макросах )
Cinder
все на макросах там
ovf
а если один очень умный человек придумал набор макросов, абстрагирующих предметную область, и все их используют -- то очень круто
Andrew
хех, в ядре linux их тоже очень много
Andrew
но это ничего не значит
Vladislav
это костыли для недостаточно экспрессивной сишечки, которые зачем-то перетянули в новый язык
ovf
ну во-первых лисповые макросы это скорее staged compilation, во-вторых, может, потому и не пишут особо на лиспах, что все макросы рисуют. :-)
Cinder
да, dsl - это хорошо
Andrew
вот и я о том же. Надо хотя бы очень умеренно их использовать. При наличии других средств
Cinder
но крестовые макросы не могут в дсл
Cinder
они вообще ни во что не могут
ovf
про c++ ничего не знаю, в си макросистема отличная и очень полезная
ovf
т.е. скажем так, проблемы с экспрессивностью у c++ не от макросистемы
Cinder
только Андреям Богрянцевам кипятить мозг
Vladislav
про c++ ничего не знаю, в си макросистема отличная и очень полезная
она ушербная уже из-за того что работает на уровне лексики, а не синтаксиса
ovf
ну я не согласен с этой импликацией
ovf
благодаря этому свойству я могу писать макросы, не имеющие по частям синтаксического смысла
Andrew
только Андреям Богрянцевам кипятить мозг
очень странно, что цпп прогер не может придумать замену макросам
Andrew
я слышал, кстати, что в C99, вводят исключения (пичалька)
Andrew
лучше бы деструкторы запили
ovf
запить, это, в целом, идея
Cinder
што?
Cinder
какие исключения?
Cinder
setjmp longjump
Cinder
никаких исключений
Andrew
setjmp longjump
и программировать дома. С работы выгонят
ovf
вводят в c99? :-) ретроактивно?
Cinder
весь гну код в этом. исключения без деструкторов - это лол
Cinder
контроллеры вообще обычно без ревью пишут. очень по разному бывает, нообычно без
Cinder
так что никого не выгонят
Cinder
да и за что выгонять?
Andrew
за то что твой код не поддерживаемый
ovf
кстати, за всю мою жизнь по-моему *jmp я использовал один раз, для написания корутин. через пару часов выкинул и заменил на ассемблерные вставки собственного сочинения (т.к. у этих *jmp гигантский оверхед)
Andrew
и что рядом с тобой коллеги, которые должны понимать, что ты колбасишь и действуешь ты в команде
Cinder
ну дак это же макросом обернули, не переживай
Cinder
Да и где ты видел поддерживаемый код на си?
Andrew
а если ты написал, а через 2 года сам же делаешь хотфикс с критикал багой, то это плохой код
Cinder
по твоему лучше клубок ифов нафигачить?
Cinder
чем имитировать исключеня через лонгджамп?
Vladislav
Cinder
да, должны
Cinder
но многие не считают себя страдающими
Cinder
одного поля ягода
Andrew
не одного. goto переходит по области видимости
ovf
ну с исключениями примерно как с автоматическим управлением памятью по-моему. либо ты знаешь, какие функции у тебя могут вернуть ошибку и какие ресурсы тебе при этом надо освободить, либо пиши на жабе
Andrew
а лонг дажмп это вообще такая ебень, что можно не просто себе в ногу выстрелить, а взорвать всех рядом
Cinder
волка боятся - в лес не ходить
ovf
(и да, продуманные макросы позволяют писать аккуратный и красивый код на тему проверки результатов функций и освобождения ресурсов)
Vladislav
волка боятся - в лес не ходить
лонг дажмпов бояться - на сишке не писать
Cinder
+++
Cinder
Продуманные макросы говоришь? Вототлаживать то такие продуманные макросы и не удобно
Andrew
да кто же боится
Cinder
Ну а так то да, теже волки и лес
Andrew
я о том, что любое стрельба из базуки должна быть оправданна
Andrew
вот я бы на вас посмотрел, когда нужно модуль-либу отлаживать, а там джампы
ovf
а зачем отлаживать макросы? в них баги?
ovf
тогда это не очень продуманные макросы
Andrew
а причём тут вообще макросы?
ovf
ну ты зачем-то жалуешься на отладку макросо
ovf
*макросов. что бы это ни значило
Andrew
про отладку макросов я не говорил ни слова
ovf
извини, это не ты, а сергей
Vladislav
ADDRESS alloc(nbytes) POS nbytes; { REG POS rbytes = round(nbytes+BYTESPERWORD,BYTESPERWORD); LOOP INT c=0; REG BLKPTR p = blokp; REG BLKPTR q; REP IF !busy(p) THEN WHILE !busy(q = p->word) DO p->word = q->word OD IF ADR(q)-ADR(p) >= rbytes THEN blokp = BLK(ADR(p)+rbytes); IF q > blokp THEN blokp->word = p->word; FI p->word=BLK(Rcheat(blokp)|BUSY); return(ADR(p+1)); FI FI q = p; p = BLK(Rcheat(p->word)&~BUSY); PER p>q ORF (c++)==0 DONE addblok(rbytes); POOL }
Vladislav
кусок кода sh. Они знают толк в продуманных макросах)
ovf
да, борн был большой фанат алгола
Andrew
вот например давно уже думаю — зачем люди плодят макросы, когда в большинстве случаев можно вызвать inline функцию
Andrew
в сишке - далеко не всегда
а чего? мне кажется там компилятор нифига не глупее
Vladislav
а чего? мне кажется там компилятор нифига не глупее
ну вот как ты определишь банальный min ?
ovf
например, нельзя, когда я на макросе изображаю свой control flow
ovf
или вообще всё что угодно, кроме тупого выражения
Andrew
ну вот как ты определишь банальный min ?
int min ( int a, int b) { return !(b<a)?a:b; :)))
Cinder
иногда в макросе генерят код или даже не генерят, а пихают в параметр макроса, а там он где-то подставляется внутри макроса и разворачивается в кусок функции, функцию или объект.
Cinder
пришло время отлаживать макросы