LINUX.ORG.RU

В Си макро магии для строк подвезли

 , ,


2

3

https://github.com/skullchap/chadstr

int table = 13;
int id = 37; 
str test1 = str("SELECT * FROM ", table, " where person_id ", id);
str test2 = str(test1);         //copies test1 to test2
str test3 = str(test2, test1); // returns concat of test2 and test1

test2 = test1; // acceptable, but wrong since test2 now points to test1 not copies it.

str(*test1); // returns const char* to use in printf like functions
Ex: puts(str(*test1)); // prints test1
chadstr test1 = str("pineapple"); 
chadstr test1range = str((range)(test1, 3,6)); // neap

Судя по всему оно умеет интерполяцию строк (в тч и конкатенацию) а так же виртуальные ранжи. В исходном коде есть зачатки сборщика мусора.

Исходный код с кучей макро магии https://github.com/skullchap/chadstr/blob/master/chadstr.h.

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

Да, там в тех ссылках и написано.

А кто их читает %)

Давайте сделаем теперь обязательными для всех С компиляторов, но с норм синтаксисом, как в С++.

Ну вроде все что ввели было с уродливым синтаксисом, типа _Generic, так что есть сомнения у меня.

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

Может и так.

Вот тут тип радуется, что какую-то чушь уже приняли в С23: https://thephd.github.io/no-us-without-you-elifdef-elifndef-c-n2645

#elifdef для препроцессора.

Хотя у этого типа из комитета С(Project Editor for C) есть интересная заметка: https://thephd.github.io/your-c-compiler-and-standard-library-will-not-help-you

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

Ну раз только тебе не нужно, может ты и в тред ничего писать не будешь? Так-то нам твои коментарии тоже не нужны

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

Раст разве не в нишу плюсов, которые и в правду набрали эволюционного балласта?

Он в обе ниши метит. Рантайм в нем проще отрубить чем в C++, исключений и rtti нет, пока мешает только отсутствие нормальных аллокаторов умеющих работать без паники.

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

Rust набрал уже больше.

Из эволюционного баланса практически ничего он пока не набрал, авторы поступили разумно при выходе версии 1.0 выкинув весь накопившийся балласт, еще более разумно они поступили введя позже механизм эпох в рамках которых также будет несложно выкидывать баласт. В С++ же весь балласт бережно хранится и выкидывается очень редко даже если массово не используется (например триграфы и auto_ptr), но для С++ который во многом был первопроходцем это вполне простительно.

По тормозам компиляции вполне конкурент C++.

Это к балласту отношения не имеет, сам язык такой.

В целом идея шаблонов повсюду убога.

Но языки без них тоже получаются убогими калеками.

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

Компайл-тайм полиморфизм и zero-cost абстракции нужны так или иначе. Если не шаблоны, так constexpr-функции и паттерн-матчинг.

Или/и хорошие ast макросы.

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

Язык убийца C/C++ не может убить язык поверх которого работает.

Си же вполне убил ассемблеры.

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

Я имел в виду что в некоторых случаях string это оверкилл, и когда похожих ситуаций становится много; целесообразнее использовать C.

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

Я имел в виду что в некоторых случаях string это оверкилл

Это никогда не оверкилл, как минимум полезна минимальная обёртка, защищающая от переполнения буфера. В коде на Си полно уязвимостей из-за голых строк.

В ядре NT для строк используется специальная структура с указанием размера.

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

Zig стал прожорливым чудовищем а-ля Rust. Но доноров периодически подкармливают какими-то миллионами строк в секунду. Delphi это умел 15 лет назад, когда компьютеры были побольше.

Да и LLVM 12 ещё не во всех дистрибутивах есть, но нужно же показывать прогресс! (Да, можно скачивать «ночнушки», но я хочу сам собирать). И эта ходьба в ногу с LLVM продолжается и продолжается.

С интересом слежу за развитием https://www.c3-lang.org

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

Да, у тебя очень серьёзные аргументы.

мешает только отсутствие нормальных аллокаторов умеющих работать без паники.

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

А чем тебе плюсовые исключения не нравятся? Ты хоть примерно представляешь как это работает? Где происходит вся магия и как разматывается стек? Любой throw транслируется в вызов функции из libstdc++, который можно с успехом подменить на abort(). Я прям сейчас у любой софтины могу «отрубить» исключения аля раст.

Рантайм в нем проще отрубить чем в C++

Угу, сложно -nostdlib.

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

исключений и rtti нет

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

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

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

А си тогда что вообще ясельный?

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

Нет, это просто облегченная версия плюсов. Если задача сложная, то нужно брать цпп.

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

Прикинь, а для этого нужны исключения,

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

А чем тебе плюсовые исключения не нравятся?

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

Я прям сейчас у любой софтины могу «отрубить» исключения аля раст.

Можешь, но программа написанная с расчетом на исключения перестанет работать.

Угу, сложно -nostdlib.

И переписать половину кода в типичном случае.

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

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

Ну а кто в плюсах заставляет пользоваться исключениями? Когда раст полез в ядро, то для него начали пилить всякую no panic обвязку, с тем же успехом для плюсов можно запилить no throw обвязку и не давать при линковке модулей ядра всякие __cxa_throw(). А вот для более сложного софта код с исключениями чище и проще.

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

с тем же успехом для плюсов можно запилить no throw обвязку и не давать при линковке модулей ядра всякие __cxa_throw()

Ты это Торвальдсу объясни.

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

И это — вполне оправданная цена за простоту языка.

Где ты простоту языка в C увидел? Даже если из GCC выкинуть все языки кроме C, останутся сотни тысяч строк кода.

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

Так есть другие нормальные языки, которые проще чем C, но ещё не ассемблер. Oberon, например.

anonymous
()

А текст по «регуляркам» Заменять умеет? Кавычки можно заэкранировать?

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

Даже если из GCC выкинуть все языки кроме C, останутся сотни тысяч строк кода.

https://github.com/TinyCC/tinycc/tree/d348a9a51d32cece842b7885d27a411436d7887b

На Windows папка с компилятором занимает 1.55 мегабайта

притом 1.12 мегабайта из них это папка include

а там 838кб занимает папка winapi (максимально урезанный конечно)

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

си-культура, вследствие которой 90% софта дырявый глюкодром.

Да-да. Всё эти ваши линукс, гиты, скьэли и прочие дашсипиды и дисиси - дырявый глюкодром, никакой культуры программирования…

Под вздохи, что си, по сравнению с плюсами - дырявый, до сих пор как было все написано на си, так и написано.

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

Так пишут через боль запуская кучу линтеров. И всё равно баги вылезают типа пресловутых единичек

bga_ ★★★★
() автор топика

Я уже тему создавал в том году примерно, что Си что-то перестал развиваться и выглядит убого на фоне Go и новых возможностей в LLVM/Clang, по выводу типов и т.п., могли бы те же каналы как в Go ввести на изи в стандарт

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

Я уже тему создавал в том году примерно,

Создай ещё раз. Я уверен, что в этот раз они все тебя послушают.

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

GCC не только компиляцией занимается. Да и компиляция у него не «в лоб», а оптимизирующая.

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

Я уже из той темы понял, что на си сидят ретрограды, которые в 90% случаев пишут либо под старое железо, либо под специфичное. И им эти «C like Golang» нахрен не сдались. Не готов ещё народ. Может, в 2030 что-то и изменится, когда на рынке будет куча софта на Go, Swift, Rust

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

Нет, это минимальная обертка. Кроме SBO ничего сверх обертки там нет.

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

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

сайт, приведенный тобой, давно протух

Да уж, man std::string выглядит пожирнее…

Кроме SBO ничего сверх обертки там нет.

Мануал подтверждает обратное :)

cpio
()

Прокрутил код. Много malloc. Я ожидал, что всё это чудо будет работать в компайлтайм. Закапывайте.

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

Где ты простоту языка в C увидел?

Повсюду

Даже если из GCC выкинуть все языки кроме C, останутся сотни тысяч строк кода.

Это все усовершенствования, оптимизации. Простой компилятор си толковый школьник в состоянии написать

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

Так пишут через боль

Ага, вон Эдуард так и светится болью…

Я тоже с удовольствием

И всё равно баги вылезают типа пресловутых единичек

Отличный был бы аргумент, если бы все остальные писали без досадных ошибок типа единичек

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

компайлтайм

И при этом можно складывать строки.. В си.. Без реаллокаций… Очень, очень тревожно

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

Ещё в си принято писать char buffer[8192]; // наверное хватит

У кого принято? Когда принято? Нужен расширяющийся буффер – делают расширяющийся буффер, нужен фиксированный массив – делают фиксированный массив.

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

Может, в 2030 что-то и изменится

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

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

мне чего-то не хватает в С

Обычная отмазка неосиляторов С :)

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

Не смотрел что там в го за каналы и как они устроены, но их можно добавить так что бы программу с ними можно было запустить на голом железе, и точно понять какая строка во что соберется?

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

Хммм...

Пора уже добавить хоть что-нибудь для изучения. Хотя бы те же каналы как в го

Вы знаете… Странно конечно. Концепция «pipes» как одного из средств IPC в юниксах появилась практически при возникновении этих самых юниксов. Но в Go зачем-то добавили «channels». Видимо, Go-программисты… не умеют читать и добавляют то, о чём изначально не имеют понятия? =)))

Ну вот например раб Божий пишет об этом:

Pipes are the Go equivalent of Unix pipes. http://en.wikipedia.org/wiki/Pipeline_%28Unix%29 has a decent introduction. On Unix like platforms, they're implemented using the real thing. See http://golang.org/src/pkg/os/pipe_linux.go?s=319:360#L1

Channels are a Go specific thing.

Ровно о том, о чём я и говорю – «pipes» как жили в юниксах, так и живут. Но Go-программисты открыли для себя «channels». Мдааа… Было внезапно так… =)))

Там учить нечего.

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

P.S. В С уже есть для начала. Немного тонкостей в продолжение. Могу ещё накидать линков, т.к. pipes штука мощная и использовать её надо грамотно. А смысл? Один чёрт читать не будете. =)))

P.P.S. Без ссылок, просто намекну. Выше (про pipes) это было про неименованные каналы. Именованные можно через mknod и через mkfifo. Оба варианта и системные вызовы и команды шелла. Т.е., можно и в скриптах и в своём коде.

Пользуйтесь, ни в чём себе не отказывайте. =))) Всё уже придумано. Но в Go добавили channels. А-фи-геть! =)))

Moisha_Liberman ★★
()
Последнее исправление: Moisha_Liberman (всего исправлений: 2)
Ответ на: Хммм... от Moisha_Liberman

Ты что-то попутал, channels - это аналог пайпов для горутин, многопоточного программирования. Странно ты пытаешься учить других, не внятно читая доки. Посмотри libmill http://libmill.org

menangen ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.