LINUX.ORG.RU

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

 


0

5

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

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

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

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

Полезно. Блок должен быть функций. Собственно это есть в гнуси, но там оно обрезанное.

Хорошо бы стандартизировать расширения GNU C - там есть и typeof, и блоки кода как выражения, и форма RAII.

Ничего кроме гнуси не нужно, да и клеануп - это такая бесполезная жопа, что лучше переделать.

И еще хочу возврат нескольких значений из функции :)

Пацаны досихпор не осилили структуры? Ну что с вас взять.

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

Пацаны досихпор не осилили структуры? Ну что с вас взять.

Структуры будут для такого подходить, если будут параметрические типы.

Типа такого:

struct pair<t1, t2>{
    t1 a;
    t2 b;
};
struct pair<double, int> some_func();
Waterlaz ★★★★★
()
Ответ на: комментарий от Carb

Зачем создавать, а потом разбирать структуру когда нужно просто вернуть несколько значений?

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

Что значит несколько значений, что значит разбирать? Нука накатай мне пример как ты вернёшь эти несколько значений - пример синтаксиса:

int a, b;//запиши в них значений 1 и значение 2 из функции f().

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

Зачем? Ну вернул ты эту структуру - что дальше? Куда ты её запишешь, а если никуда записывать не надо - как ты из неё получишь значений по отдельности?

В этом языке типы не нужны, ни простые ни их составные, а если они тебе нужны - у меня для тебя плохие новости.

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

Если тебе нужны какие-то более фичастые вещи - стейтмашина, контексты тебе в помащь. work(); - апдейтит твой окнтекст, далее выщёлкиеваешь get_int(), get_double().

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

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

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

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

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

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

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

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

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

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

(multiple-value-bind (a b) (f) (list a b))

скобокостыли на списках в динамике, вот в как нормальных ЯП сделано:

let (a, b) = foo();
wota ★★
()
Ответ на: комментарий от tailgunner

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

Sorcerer ★★★★★
()
Ответ на: комментарий от 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_ ★★★★★
()
Ответ на: комментарий от korvin_

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

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

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