LINUX.ORG.RU

Что нужно добавить в C?

 


0

5

Расскажите, что бы вы хотели добавить в си? Только то, что реально можно добавить, не делая при этом новый язык. Просто фичи, которых не хватает.

Или покритикуйте мой список.

  • Константы. #define - препроцессор, const не работает полноценно в compile-time, enum только для целых и вообще для другого .
  • Лямбды (анонимные функции) - для удобства коллбеков. Можно без замыканий, т. к. они много скрывают.
  • Модули, если возможно. Для изоляции единиц трансляции.
  • Интроспекция (typeof, хотя бы) - для обобщенного программирования.
  • Более развитая макросистема - для того же. Например, возможность макросы раскрывать в директивы препроцессора.
  • Пространства имен, чистые функции, switch по составным типам, case с диапазоном - для сокращения кода.
  • Аналоги volatile и restrict с более точным контролем - для микрооптимизации.
  • Доступ к стеку вызовов, goto между функциями - для трюков типа трамплинов.
  • В стандартной библиотеке - строки, контейнеры, foreach, большие числа. Возможно, сокеты.
★★★★

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

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

Иногда пара - это всего лишь пара. На каждый такой случай пилить свой тип pair_of_double_and_int и говорить, что так и надо, может только упоротый неадекват.

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

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

Т.е. кроме кастыля из ниначто неспособного недоязычка ты ничего не осилил - похвально. Только в отлии от твоего надоязычка на сишке пишут, много, причем это должно вменяемо работать и не быть говном. Запиши сначала а, потом б, не вызывая функцию 2раза. Потом добавь объявление переменных.

Даже убожество f(&a, &b) лучше твоего мусора выглядит.

Теперь выдай это же в сишной синтаксисе, хотя этого даже в твоём синтаксисе нету, но ты хотябы попытайся.

Так же ты не написал что такое разбор структуры и как это.

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

Тогда уж нужна конструкция, не занятая текущим синтаксисом.

Sorcerer ★★★★★
()

Автор, ты сколько компиляторов в своей жизни написал? Ну ладно, сколько машин ты написал? Ты машину Маркова хоть раз в жизни писал?

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

Константы. #define - препроцессор, const не работает полноценно в compile-time, enum только для целых и вообще для другого .

гавно

Лямбды (анонимные функции) - для удобства коллбеков. Можно без замыканий, т. к. они много скрывают.

гавно

Модули, если возможно. Для изоляции единиц трансляции. Интроспекция (typeof, хотя бы) - для обобщенного программирования. Более развитая макросистема - для того же. Например, возможность макросы раскрывать в директивы препроцессора.

всё это говно

Пространства имен, чистые функции, switch по составным типам, case с диапазоном - для сокращения кода. Аналоги volatile и restrict с более точным контролем - для микрооптимизации. Доступ к стеку вызовов, goto между функциями - для трюков типа трамплинов. В стандартной библиотеке - строки, контейнеры, foreach, большие числа. Возможно, сокеты.

ещё говно

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

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

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

Не ведись на лоховоды вокруг стандартов.

sanaris
()

Возможно, сокеты.

Сокеты в материнке добавить надо.

Если без шуток, пусть все эти стандартщики разберутся сами с собой, как им реализовать единую либу потоков нормальную. Сколько уже живём, есть только МПИ и всё. Остальное говно.

sanaris
()

Два плюса

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

Ну я не сомневался, что ты не осилишь.

Не осилю что?

Запиши сначала а, потом б, не вызывая функцию 2раза. Потом добавь объявление переменных.

Функция вызывается один раз. Объявление переменных абстрагированно.

Теперь выдай это же в сишной синтаксисе

Зачем мне сишный синтаксис?

Так же ты не написал что такое разбор структуры и как это.

Не важно что это, важно что этого не нужно делать.

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

Питон? так там возвращается одно значение кортежом. Это не то же самое.

loz ★★★★★
()
Ответ на: комментарий от Carb
func f() (a, b int) {
    return 1, 2
}

a, b := f()
# limbo

f(): (int, int)
{
    return (1, 2);
}

(a, b) := f();

Да тысячи их.

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

Тащемта values ни разу не список

посмотрел реализацию в sbcl - еще как список (что в принципе и логично), но мне интересно услышать твое мнение - что же это

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

посмотрел реализацию в sbcl - еще как список

Ссылочку? Ну и implementation-dependent, если бы это всегда был список, не было бы необходимости в специальных формах.

korvin_ ★★★★★
()

цитаты (угадай откуда)

Как правило, при профессиональном программировании часто приходится иметь дело с понятием «адреса». Универсальные языки программирования всячески стараются избегать этого понятия, считая его чисто «машиным», из-за чего возникают свои специфические трудности. Частично их преодолевают, вводя понятие «указателя», просто алгоритмического аналога адреса, а частично - вводя понятие «разыменования». Это уже более сложное понятие, особенно если в языке сложная система описания типов переменных. Дело в том, что имена переменных, скажем a и b, в разных контекстах надо трактовать по разному. Ясно, что если мы напишем оператор a=b , то a и b означают разные вещи: b относится к значению переменной b, а а указывает, именует, адресует переменную a и не имеет никакого отношения к значению этой переменной. Если мы хотим одинаково хорошо манипулировать и значениями переменных, и их адресами, именами и т.д. ( а при программирование на низшем уровне это необходимо) мы должны точно говорить, что есть что. Наиболее логичное ( или по крайней мере чёткое) решение принято, например, в языке ВЫРЕЗАННО ЦЕНЗУРОЙ, где употребление имени переменной всегда сопоставляется с её внутреним именем, адресом. Для ссылки же на значение переменной используется операция «точка». В этом языке оператор a := b означает, что переменная a принимает значение адреса переменной b . Традиционное же присваивание записывается так:

a := .b

Хотя такая система крайне простая и чёткая, в языке Си она использованна не была. Отчасти, очевидно, из-за того, что профессионалы спокойнее относятся к контекстному толкованию и не хотят видеть в программе «лишнии» символы: ведь их в конце концов придётся самим и писать .

...

Так как ВЫРЕЗАННО ЦЕНЗОРОМ2, ЦЕНЗОРу1 выговор с занесением за халатность был универсальным языком, а универсальные языки в силу своей природы тяготеютк системам контекстной зависимости и неявного разыменования, то в Си остался именно такой подход.

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

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

не было бы необходимости в специальных формах.

дык «special form. a list, other than a macro form. The first element of a special form is a special operator.»

wota ★★
()

Лямбды (анонимные функции) - для удобства коллбеков. Можно без замыканий, т. к. они много скрывают.

this

Более развитая макросистема - для того же. Например, возможность макросы раскрывать в директивы препроцессора.

and this.

Остальное ненужно.

goto между функциями

Это делается средствами операционной системы. man makecontext swapcontext (вроде так, из-под винды пишу, не помню)

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

Давно мечтаю о языке, семантически эквивалентном Си, но имеющем синтаксис в унифицированных выражениях а ля s-expr. Чтоб можно было при помощи макросов гнуть код как угодно.

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

Фразу «монадическими конструкциями» ты пропустил?

И чем принципиально функция, возвращающая Data|Error, отличается от функции, возвращающей Data или кидающей Error? Ничем не отличается. Семантически это тот же самый Data|Error.

А вот в реализации монадический подход скорее всего всосёт по скорости работы и объёму кода, при чем всосёт сильно. (Если конечно твой компилятор не обладает естественным интеллектом и способностями ванги, чтобы цепочку монадических вызовов оптимизировать код с стиле крестов.)

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

В винапи было бы int WINAPI CompareStringsA и принимающее пару LPCTSTR :)

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

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

Ты сделал меня прослезиться. Лови симпу :)

yoghurt ★★★★★
()

Расскажите, что бы вы хотели добавить в си?

мозгов-бы тебе...

Константы. #define - препроцессор, const не работает полноценно в compile-time

нормально он работает. Просто ты не понимаешь, зачем он нужен.

Лямбды (анонимные функции) - для удобства коллбеков

есть typdef и указатели на функции.

Модули, если возможно. Для изоляции единиц трансляции.

есть. Это файлы.

Интроспекция (typeof, хотя бы) - для обобщенного программирования.

есть другие более абстрактные ЯП. Тысячи их.

Пространства имен, чистые функции, switch по составным типам, case с диапазоном - для сокращения кода.

case как раз код и сокращает, ибо компиллится в набор goto/косвенных jmp по таблице. А то, что ты хочешь, можно реализовать иначе.

Аналоги volatile и restrict с более точным контролем - для микрооптимизации.

есть ассемблерные вставки.

Доступ к стеку вызовов, goto между функциями - для трюков типа трамплинов.

не боишься, что коллеги убьют?

В стандартной библиотеке - строки, контейнеры, foreach, большие числа. Возможно, сокеты.

это невозможно сделать достаточно абстрактно (для библиотеки), и одновременно дёшево в общем случае. Нужен более высокий уровень абстракций, как ты и хочешь. Попробуй C++, там всё это есть.

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

вот тот же Unix&C по факту ОС это сборщик муссора в том числе ,а С- программа даже не обязана ( и у патриархов сплош и рядом так код и написан) free-шеть mallocнутую память С- программе достаточно свялится , а ОС похоронит трупик и вернёт всё в биогеоценоз.

qulinxao бесподобен.

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

вот тот же Unix&C по факту ОС это сборщик муссора в том числе ,а С- программа даже не обязана ( и у патриархов сплош и рядом так код и написан) free-шеть mallocнутую память С- программе достаточно свялится , а ОС похоронит трупик и вернёт всё в биогеоценоз.

дык это везде так.

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

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

Ээээ... А подробнее?

anonymous
()

1,2,4,5 - ты C не перепутал с чем-то ещё?

3 - да, было бы кстати

6 - отчасти.

8 - по факту есть и так, только не как часть языка

9 - да

Но всё, в целом, несущественно.

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

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

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

И чем принципиально функция, возвращающая Data|Error, отличается от функции, возвращающей Data или кидающей Error?

Зависит от того, что именно является принципиальным для тебя.

Семантически это тот же самый Data|Error.

Data | Error - это тип, Data и исключение Error - это НЕХ.

А вот в реализации монадический подход скорее всего всосёт по скорости работы

Для этого нет никаких причин. А вот исключения да, всасывают по скорости.

и объёму кода

При наличии удобных конструкций - нет, и даже примитивный макрос do_ это показывает.

при чем всосёт сильно

Какая уверенность. На чем она основана?

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

Нормальное именование библиотечных функций. Например compareStrings вместо strcmp.

ну возьми, да и пересобери glibc.

PS: если что, то в C нет никаких Strings.

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

Data | Error - это тип, Data и исключение Error - это НЕХ.

Внезапно, это тоже тип. Дебилом перестаём прикидываться, ага?

Для этого нет никаких причин. А вот исключения да, всасывают по скорости.

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

При наличии удобных конструкций - нет, и даже примитивный макрос do_ это показывает.

Ага, «примитивный макрос do_» обильно обмазывает всё синтаксическим сахаром, и внезапно tailgunner начинает считать, что код, который коротко записывается, будет такой же короткий и быстрый после компиляции.

Какая уверенность. На чем она основана?

На понимании того, в какие машкоды скомпилируется код на исключениях, и в какие - код на монадах. Слушай, меня тут страшная догадка осенила. Может ты не прикидываешься дебилом? Может ЛОР всё-таки необработимо разрушил твой мозг?

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

Data | Error - это тип, Data и исключение Error - это НЕХ.

Внезапно, это тоже тип

Это, разумеется, не так.

«примитивный макрос do_» обильно обмазывает всё синтаксическим сахаром, и внезапно tailgunner начинает считать, что код, который коротко записывается, будет такой же короткий и быстрый после компиляции.

Он будет коротким, да. И хорошо оптимизируемым.

Дебилом перестаём прикидываться, ага?
Дебилом перестаём прикидываться, ага?

«Ты за рулем - ты и поворачивай» (ц)

Слушай, меня тут страшная догадка осенила.

Да ты вечно на нервах весь.

Может ты не прикидываешься дебилом?

Не прикидываюсь.

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

Он будет коротким, да. И хорошо оптимизируемым.

Ыгы. Верю как родному.

Да ты вечно на нервах весь.

Не вечно, только когда приходится писать из-под *** семерки, где нельзя настроить нормальное переключение *** раскладки. :D

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

Он будет коротким, да. И хорошо оптимизируемым.

Ыгы.

Сравнение и переход.

Верю как родному.

И это правильно.

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

Сравнение и переход.

В количестве овердохера.

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

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

Сравнение и переход.

В количестве овердохера.

Одно сравнение и один переход на вызов функции.

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

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

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

А вот исключения да, всасывают по скорости.

И это даст офигенный выигрыш в пару процентов производительности

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

Попробуй читать текст до конца:

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

если исключения вообще не возникают

А если возникают - то всё.

tailgunner ★★★★★
()

анонимные функции

удваиваю, желательно в JS-стиле

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

в 21 первом веке он уже даже не адекватен. ни в какой сфере применения.

next_time ★★★★★
()

по сабжу: помимо того, что сишке не хватает плюсов, в ней не хватает также циферок в двоичном коде, а-ля 0101010b — да-да, этого до сих пор в ней нет

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

Если так надо, то почему не он?

потому, что плюсы не держат почти никакие МК, о других ЯП и говорить нечего. если бы не закостенелость мозгов разработчиков, давно бы на плюсах писал.

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