LINUX.ORG.RU

В стандарт C предложено внести лямбды и defer из golang

 , ,


5

6

Привет, ЛОР!

Я тут тебе немного покушать принёс. Как ты, наверное знаешь, не за горами выход нового стандарта языка C – C23. Среди прочих вкусностей, таких как лямбды в стиле C++, в этот стандарт предложено добавить механизм defer, аналогичный существующему в языке Go.

Ссылка на предложение: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2895.htm

В случае, если этот стандарт будет принят, будет возможно написание вот такого кода:

p = malloc(N);
defer { free(p); }

Где аргументом оператора defer является анонимная функция. Так же возможны более сложные варианты использования:

enum { initial = 16, };
double buffer[initial] = { 0 };
...
size_t elements = 0;
double* q = buffer;
defer [orig = q, &q]{ if (orig != q) { free(q); }};
...
// increase elements somehow
...
// adjust the buffer
if (elements > initial) {
    double* pp = (q == buffer) ? malloc(sizeof(double[elements])) : realloc(q, sizeof(double[elements]));
    if (!pp) return EXIT_FAILURE;
    q = pp;
}
...

Учитывая всё это, скоро в C больше не будет нужно использовать goto вообще нигде, даже для очистки ресурсов при ошибке. Так заживём, ЛОР!

Ответ на: комментарий от thunar

Потому что (*p).x гораздо понятнее и яснее чем p->x. Iron_bug вот так всё время и пишет же ну.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от bread

Нет никакой связи между жонглированием указателями и пониманием алгоритмов.

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

Ну нету софта на ваших расчудесных язычках нормального, которым люди хотели бы пользоваться. Нету. И даже в том что есть, любые, мало-мальски значимые алгоритмы, внезапно, обязательно вынесены в какие-нибудь JNI, библиотечки, модули и т.п. написанные внезапно на сишечке. Хоть убейтесь, а умение жонглировать указателями, дрючить байты и заниматься ручной аллокацией памяти рулит.

Десятилетиями рассказываются эти сраные сказки про плохие указатели и негодный goto, но ничего кроме этих сказок в итоге никогда не появлялось. Как пилили ништяки на сишечке, так и продолжают. Даже с ОС смешно вышло - все попытки написать ОС хотя бы на плюсах - провалились с треском. Epoc32 AKA Symbian частично написанный на C++ и продержавшийся достаточно приличное время мгновенно сдох, никому вообще не нужный, как только лишился опеки корпораций.

Может быть, когда-нибудь, какой-нибудь будущий паскалисп или жабораст и потеснят сишечку и избавят ваши пердаки от этого неуютного жжения от удобнейших и простых в использовании указателей и чудесных goto, но я сильно сомневаюсь что это вообще когда-нибудь произойдёт, по крайней мере до изобретения какой-то архитектуры принципиально отличающейся от всего что мы знаем. Да и даже в этом случае, вряд-ли основным языком этой невообразимой архитектуры станет что-то и нынешних хипстерских «правильных» язычков. Это может оказаться вообще что-то, более неприятное для неосиляторов чем сишечка.

Кстати, совершенно непонятно - десятилетия демонстрируют простой факт, что без сишечки никуда, и никакие новые язычки никак не приводят к написанию более лучшего софта, программ, других овощей. В чём вообще проблема освоить эту простейшую сишечку и перестать откладывать кирпичи от банальной битовой арифметики, указателей, goto и т.п.? Это ведь просто несложные и удобные инструменты - их легко можно использовать при необходимости в своих целях. Этим инструментам совершенно наплевать, что использующий их пассажир, например, прётся от жабки или паскаля, они не будут вставлять палки в колёса и диктовать какие-то паттерны. Всё зависит исключительно от прямоты рук их применяющего. Или всё-же нелюбители сишечки просто криворукие уроды, которые прекрасно понимают, что без сишечки одна чорт никуда, но в сишечку у них мозгов не хватает?

Stanson ★★★★★
()
Ответ на: комментарий от X512

Уже разбирали же. Это писалось в те времена, когда среднестатистический код представлял собой лапшу без функций, циклов и условных переходов. Сейчас такой проблемы нет. Код же должен быть прежде всего человеко-читаемым и в отдельных случаях «goto end» семантически намного уместе «while (true) ... break».

thunar ★★★★★
()
Ответ на: комментарий от thunar

Код же должен быть прежде всего человеко-читаемым и в отдельных случаях «goto end» семантически намного уместе «while (true) … break».

Что мешает вынести код в отдельную функцию/лямбду и сделать return? Пихая всё в одну функцию получается

лапшу без функций, циклов и условных переходов

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 1)
Ответ на: комментарий от thunar

замусоривание стандарта. нет смысла городить левые операторы, если можно с помощью других написать в точности то же самое.

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

Iron_Bug ★★★★★
()
Ответ на: комментарий от Iron_Bug

а уж в функциональности сишечке нет равных. на нём можно написать всё вообще.

На Брейнфаке тоже.

X512 ★★★★★
()
Ответ на: комментарий от X512

Что мешает вынести код в отдельную функцию/лямбду и сделать return. Пихая всё в одну функцию получается

Тебе скорее всего придётся написать десяток таких функций/лямбд для разных участков кода при мало-мальски сложной функции. Например, если тебе надо прочитать что-то из какой-нибудь железки, причём не зная что она тебе ответит, с разными вариантами завершения общения при разных исходах, то там будут десятки вариантов выхода которые возможно придётся выполнять на разных стадиях общения. В случае goto код получается компактным, понятным, и красивым. В любых других случаях получается нечитаемая лапша и скобкота, а если там ещё и всякие подковёрные defer с отдельными функциями будут, то это вообще будет жопа полная, а не код. Это прекрасно понимают все, кто хоть раз пытался написать что-то реальное, взаимодействующее с реальным внешним миром через железо.

Stanson ★★★★★
()
Последнее исправление: Stanson (всего исправлений: 1)
Ответ на: комментарий от Iron_Bug

замусоривание стандарта. нет смысла городить левые операторы, если можно с помощью других написать в точности то же самое.

Зачем нужны функции если все то же самое можно сделать через longjump и метки? Алсо да, стуктуры тоже лишними выглядят.

anonymous
()
Ответ на: комментарий от Stanson

Это прекрасно понимают все, кто хоть раз пытался написать что-то реальное, взаимодействующее с реальным внешним миром через железо.

Пытался и не раз, ни одного goto нет. Я его наверное в жизни ни разу не писал (ассемблер не в счёт) и точно не знаю как он в Си пишется.

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 1)
Ответ на: комментарий от Stanson

зело плюсую.

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

плохо, когда языки начинают писать чистые теоретики. с плюсами такая фигня приключилась: деятельные графоманы добрались до стандарта и теперь плюсы превратились в какого-то монстра Франкенштейна, где 99% фич абсолютно никак не относятся к реальным задачам и даже за уши там притянуть хоть какое-то применение очень сложно. сишку писали практики, и это хорошо. и не надо пытаться его превращать в нагромождение никому не нужных наворотов только потому что гипотетически это возможно.

Iron_Bug ★★★★★
()
Ответ на: комментарий от anonymous

можно. я ничего против ассемблера не имею. иногда надо делать вставки на ассемблере. и в сишечку ассемблер интегрируется просто превосходно. если нужно что-то оптимизировать или как-то подогнать под конкретную архитектуру - всегда пожалуйста.

Iron_Bug ★★★★★
()
Ответ на: комментарий от Iron_Bug

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

Вы про такую реальную разработку?

X512 ★★★★★
()
Ответ на: комментарий от Stanson

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

Windows?

anonymous
()
Ответ на: комментарий от X512

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

Iron_Bug ★★★★★
()
Ответ на: комментарий от anonymous

Алсо да, стуктуры тоже лишними выглядят.

Именно так!
В API, использующем метаданные в run-tme РУЛЯТ void, * и &.
Свой struct имеется, но в нем можно использовать свойства для полей или объекта /любой сложности/, ссылки /не Си-шные, а ссылки на объекты, файлы, гиперссылки, …/ и …
«struct» он назван лишь потому, что он может быть представлен как обычная Си-шная структура …

Но в RUN-TIME и по три рубля, а вчера по пять! ...

Вот не пойму весь этот непрерывный плач и сетования, что ЧЕГО ТО ТАМ НЕ ХВАТАЕТ …
Наверное

ЯЙЦА МЕШАЮТ! ...

Владимир

Владимир

anonymous
()
Ответ на: комментарий от Iron_Bug

брейнфак плохо согласуется с процессорными архитектурами и операционными системами. сишечка же была специально разработана для написания осей.

Для написания кода под PDP-11. Тот код, что компилятор генерирует сейчас, не имеет к этому никакого отношения.

anonymous
()
Ответ на: комментарий от anonymous

Смотрю ныне поуходило народу много с форума.

И ПРАВИЛЬНО! ...

Треп сильно отвлекает от разработки.
Да и толку от трепа ( -1 + 1 - 1 + 1 - 1 + 1 - 1 + 1 … )

Ну вы поняли! ...

Владимир

anonymous
()
Ответ на: комментарий от X512

Ну так бы и сказал - я не знаю о чём речь.

Простейший пример - тебе надо пообщаться с некоей железкой, при этом общение с ней должно завершаться несколькими, частично совпадающими разными способами, в зависимости от того, на какой стадии общения случилась ошибка, и какая именно. При этом, если завершить общение неправильно, железка наглухо виснет. Написать без goto конечно можно, но получается лютая нечитаемая говнина, малейшие шевеления которой приводят к жопе, вместо совершенно прозрачного кода в котором что-то поломать или забыть затруднительно.

Stanson ★★★★★
()
Последнее исправление: Stanson (всего исправлений: 1)
Ответ на: комментарий от Stanson

при этом общение с ней должно завершаться несколькими, частично совпадающими разными способами

Функции? Не, не слышали. Если пугают накладные расходы, есть инлайн.

Признайтесь уже что программировать не умеете. Говнокод среди железячников – типичное явление. Там пока всё не покрыть тестами, ничего нормально работать не будет.

X512 ★★★★★
()
Ответ на: комментарий от Stanson

Это шутка такая, что-ли? В Windows сишечка на сишечке сидит и сишечкой погоняет.

Windows?
Да нет, она не ПАНАЦЕЯ!
Разработчикам Microsoft конечно РЕСПЕКТ, но корпорации как бабушки на БАЗАРЕ.
Семечки хорошо продаются?
Завтра возьму на БАЗАР

ВЕДРО ЛЯМБД ...

На их «технологии» сильно не ориентируюсь - ТАК СЕБЕ! …

Владимир

anonymous
()
Ответ на: комментарий от Stanson

Это шутка такая, что-ли? В Windows сишечка на сишечке сидит и сишечкой погоняет.

В Windows C++ по самые гланды.

anonymous
()
Ответ на: комментарий от X512

Функции? Не, не слышали.

out_set_hold_current_low:
    device_send( dev, CMD_SET_CURRENT, HOLD_CURRENT_2TONS );
out_end_sess:
    device_send( dev, CMD_END_SESSION, session_id, ret );
out_release:
    device_send( dev, CMD_RELEASE, ret );
out_close:
    device_close( dev );
out:
    free( dev );
    return ret;
}

А с функциями многотонная херня почему-то всё время норовит свалить куда-то, часто с нехилыми повреждениями.

Признайтесь уже что программировать не умеете.

Заниматься тем, что вы назваете «программированием» - нет, не умею и не хочу уметь.

Stanson ★★★★★
()
Ответ на: комментарий от anonymous

В Windows C++ по самые гланды.

В свистелках и перделках - да. А где что-то мало-мальски серьёзное - внезапно сишечка.

Stanson ★★★★★
()
Ответ на: комментарий от X512

Функции? Не, не слышали. Если пугают накладные расходы, есть инлайн.

Вообще все ядро забито goto и там это правда удобно.

anonymous
()
Ответ на: комментарий от X512

Признайтесь уже что программировать не умеете.

Он никогда не признается, но всем думающим это давно очевидно.

fsb4000 ★★★★★
()
Ответ на: комментарий от X512

Смотря какое ядро. Линукс да забит, потому что дырявый говнокод с руткитами.

А какие варианты-то? Если у тебя большого места с обработкой ошибки, на C только два вариант – тащить за собой kfree() и его аналоги или goto. Убогонький недоязычок же.

anonymous
()
Ответ на: комментарий от anonymous

А какие варианты-то?

Деструкторы и try/catch/finally. В ядре NT исключения есть и активно испрользуются. Даже в Си исключения есть в виде расширения MS.

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 1)

В стандарт C предложено внести лямбды и defer из golang

Шас спою …

Это не вранье, не небылицы.
Видели другие видел я,
Как в GO, превратить пытались Си.

Чтоб ему не видеть синей дали
И не отрываться от земли,
Грубо Си окольцевали
И в журнал отметку занесли.

Спрятали в шкафу, зафлудили на ЛОР-е
Белой птице счастья моего,
Чтоб она дышала теплой пылью
И не замечала ничего.

Но недаром птица в небе крепла.
Дураки остались в дураках.
Сломанная клетка, кучка пепла.
А Си снова в облаках.

Владимир

anonymous
()
Ответ на: комментарий от X512

Ну вот все это просветленными адептами C считается бесполезным сахаром и единственный OSS проект где я видел деструкторы это systemd.

Серьезно, C уже надо просто закопать, хватит.

anonymous
()
Ответ на: комментарий от fsb4000

Он никогда не признается, но всем думающим это давно очевидно.

Так он не программирует.
У него ДУША ПОЕТ и КОД ЛЬЕТСЯ КАК ПЕСНЯ!
Не каждому дано!

РЕСПЕКТ @X1024! ...

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Sorry

Меня уже года четыре троллят и подписываются Владимир.
Извиняться мне не за что.
НИКАКОГО ГНИЛОГО поста от меня НЕ БЫЛО! …

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Sorry

Меня уже четыре года троллят и НЕ подписываются Владимир. Извиняться мне есть за что МНОГО ГНИЛЫХ постов от меня БЫЛО! …

Владимир

anonymous
()
Ответ на: комментарий от Stanson

они не будут вставлять палки

Это почему же? А метаданные?

А ИНАЧЕ НАМ УДАЧИ НЕ ВИДАТЬ ...

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Проблема в нетерпимости этого форума ко мне заключена в НЕ ТОЛЕРАНТНОСТИ и ЗАВИСТИ …

Владимир

anonymous
()
Ответ на: комментарий от Stanson

Может быть, когда-нибудь, какой-нибудь будущий паскалисп или жабораст и потеснят сишечку и избавят ваши пердаки от этого неуютного жжения от удобнейших и простых в использовании указателей и чудесных goto

А что, в расте нет указателей что ли?

anonymous
()
Ответ на: комментарий от anonymous

А что, в расте нет указателей что ли?

Причем тут раст? Внимательно перечитайте ВСЕ мои посты. В них нет ГРЯЗИ …

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Ехал Владимир через Владимир

Видит Владимир в Владимир Владимир

Сунул Владимир Владимир в Владимир

Владимир Владимир Владимир Владимир

anonymous
()
Ответ на: комментарий от anonymous

Ну вот все это просветленными адептами C считается бесполезным сахаром и единственный OSS проект где я видел деструкторы это systemd.

Что только не делают, лишь бы не писать на C++

anonymous
()
Ответ на: комментарий от anonymous
В то же лето к $ уездной земской управы goto из toupper(v&)
class SunA: protected Selivanus {
    
    typedef void(Selivanus::*f)(void);
    
    typedef SunA*(*fn)(void);
    
    virtual void eat(void) const
    {
    }
}; 
void main(int argc, char* argv[])
{
    SunA* su = new SunA();
    SunA::f fn = &Selivanus::eat;
    (su->*fn)();
    
    SunA::fn pf = &SunA::eat;
    Selivanus* se = (*pf)();
    se->eat();
}

Отдыхая by Poul-Henning Kamp for R&D Associates и гремя неумело вделанными шпорами, в подвал входит fn get() -> &str; #[expect(unused_mut, reason = "...")] –> жирный юноша с обвислым розовым лицом. В rfc он разыскал даже литографированный портрет своего Selivanus use rustc::mir::{*, transform::{MirPass, MirSource}}; верхом на сивой кобыле;

anonymous
()
Ответ на: комментарий от Stanson

Epoc32 AKA Symbian частично написанный на C++ и продержавшийся достаточно приличное время мгновенно сдох, никому вообще не нужный, как только лишился опеки корпораций.

Он сдох, потому что появился айфон, а потом и андроид, которые начали эру сенсорных телефонов. А еще потому что сраная Нокия жилила API для сторонних разработчиков. Это ж надо было додуматься. Лакмусовая бумажка - сколько приложений-«фонариков» на андроид и сколько на симбу (0, если что 💩)? Поэтому когда появился андроид с его маркетом и открытым API, симбиан встретил его с голым задом, потому что разрабов под него почти не было. А пользователям перебежать с одной железки на другую ничего не стоит, если они не завязаны на какой-то софт. Короче, тут налицо просчеты менеджмента, но не качества ОС на плюсцах.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Никто не хотел писать под симбиан не потому что досутпа к фонарику не давали. А потому, что ОС изза своей плюсовости добавляла кучу ненужного геморроя в юзерспейсе. Кому захочется писать hello world, в котором внезапно, нужен не только обычный конструктор, но и всякие HelloWorld::ConstructL, HelloWorld::NewL, HelloWorld::NewLC и прочая дребедень типа SetActive на каждый чих и пр. RunL. Писать-то можно было, но это было ужасно уныло. В итоге запилили, конечно, Qt для симбиана, что избавляло от этого всего геморроя, но было уже совсем поздно.

В гайке несколько менее страшно, и там хотя бы POSIX вроде искаропки без всяких PIPS’ов. Но и гайка мало кому интересна, несмотря на всякую замечательную микроядерность, плюсность и прочая.

Лакмусовая бумажка - сколько приложений-«фонариков» на андроид и сколько на симбу

Вообще не показатель ни разу. Вернее, показатель того, что искаропки в ведроиде нихрена нету, зато есть куча обезьян лепящих на жабке всякую херню в немеряных количествах, причём часто со всякой малварью и рекламой. А на симбиановских телефонах типа N8 и пр. в качестве вспышки вообще использовалась ксеноновая газоразрядная лампочка, которая в принципе не может светить постоянно (соответственно физически нет никакого gpio и соответственно интерфейса API который мог бы заставить вспышку светить постоянно), поэтому в качестве источника света использовали подсветку экрана телефона. Таких «фонариков» дофига было. Потом, когда пошли светодиодные вспышки, появились и обычные нынче «фонарики» для симбианов которые светили светодиодом вспышки. Мальварь и рекламу в них было запихивать проблематично, из-за политики симбиановских магазинов, поэтому никто и не струячил их тысячами как для ведроида.

Stanson ★★★★★
()
Последнее исправление: Stanson (всего исправлений: 4)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.