LINUX.ORG.RU

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

 


0

5

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

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

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

Дженериками принято называть параметризованные типы, которых в Go просто нет. Интерфейсы в Go - это, во-первых, не дженерики, а во-вторых, в некоторых важных случаях (контейнеры) подразумевают динамическую проверку типа.

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

это будет тупо другой язык

Ну так мы, вроде, не только про идеи unsigned`а, а как вообще в языках.

И я не только Go привел в пример.

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

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

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

Ну так мы, вроде, не только про идеи unsigned`а, а как вообще в языках.

Не, я конкретно про доработки Си, при которых он остается Си. Если «вообще» - Rust выглядит неплохо.

http://static.rust-lang.org/doc/master/std/macros/macro.try.html

Мне категорически не нравятся макросы, у которых внутри return.

значений запихнуто не много.

Да. 3 значения уже может быть слишком много.

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

Смотря что и как они делают.

В примитивных случаях разницы между кодом на ржавчине и сишным кодом, собранным clang`ом, не должно быть.

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

Я читал только туториал rust, сейчас посмотрел - там про память очень бегло. Модели не объясняются, а я их дальше смартпойнтеров не изучал. Надо просто что-то специальное почитать.

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

То есть rust за собой рантайма не тащит? И как у него с кросс-компиляцией под arm например? про мипс и не спрашиваю.

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

Если бы к элементам структуры можно было обращаться по индексам

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

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

То есть rust за собой рантайма не тащит?

Есть сборка без рантайма, если ты об этом.

И как у него с кросс-компиляцией под arm например?

Уже почти есть (или даже просто есть - читал пару недель назад в rust-dev@ инструкции по сборке кросс-компилятора для ARM).

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

А поясни для знающих питон сильно поверхностно?

def foo():
  return 1, 2

one, two = foo() # это распаковка

one = foo()[0] # доступ по индексу
tailgunner ★★★★★
()
Ответ на: комментарий от Dark_SavanT

Такой вариант реально даёт преимущества перед возвращением tuple?

Ммм... в Python это и есть возвращение кортежа. Вопрос в том, что возвращенное значение можно распаковать или доступаться к полям по индексу.

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

Где это есть в адекватном виде кроме CL?

А там в адекватном? А то вызвал такую функцию — оно само отвалилось если не подобрал костылём (multiple-value-bind), чтобы передать все возвращённые values аргументами в другую функцию — опять прочие костыли (*-call, *-list и что там ещё). tuple с operator MainType() в C++ и то лучше себя вести будет :)

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

А то вызвал такую функцию — оно само отвалилось если не подобрал костылём (multiple-value-bind)

Это с какой стороны посмотреть. Можно брать значение из функции, как всегда, если нам нужно только первое, или юзать multiple-values-bind, если нам надо больше. Не вижу проблемы, на мой взгляд очень удобно

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

Это с какой стороны посмотреть.

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

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

template <typename T, typename /*...*/ Ts>
struct Values {
    T main;
    Ts rest;
    operator T() { return main; } // implicit!
};
quasimoto ★★★★
()

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

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

Ну и вопрос производительности — нам всё кидать (может там multiple-value-bind) или только часть (нет)? С явными (+ с неявными преобразованиями ?) кортежами это регламентируется типами.

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

чтобы не делать структуру с 2-3 полями просто для возврата результатов.

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

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

Это было сказано про C++. Что такое implicit type conversions в C++? http://www.cplusplus.com/doc/tutorial/typecasting, http://en.cppreference.com/w/cpp/language/implicit_cast.

Ещё было сказано

в динамическом языке с множеством неявных преобразований

Это все неявные преобразования на решётке типов, очевидно. В данном случае хотя бы (values main-type ...) -> main-type (возвращаем первое, принимаем второе, всё преобразовывается). А вообще — преобразования в numerical tower, поднятия в t и т.п.

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

Это очень спорный пример, как по мне. Никогда не любил std::pair, особенно учитывая, что в плюсах нет сопоставлений с образцом.

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

в рабочем коде мне нельзя использовать С++11 :(

Эта фишка C++11 реализована в GNU C++ уж лет 5 назад; думаю, что в MSVS (или что там у тебя) примерно тогда же.

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

Мне категорически не нравятся макросы, у которых внутри return.

Разве данный конкретный макрос на практике чем-то сильно хуже do-синтаксиса?

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

эта фишка C++11 реализована в ... уж лет 5 назад

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

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

дальше смартпойнтеров не изучал

все же просто:

  • ~ - аналог С++-ового unique_ptr;
  • & - аналог С++-овой ссылки;
  • * - обычный указатель (дико опасен, поэтому используется только внутри unsafe{...} секций).
ozkriff
()
Ответ на: комментарий от ozkriff

Мне категорически не нравятся макросы, у которых внутри return.

Разве данный конкретный макрос на практике чем-то сильно хуже do-синтаксиса?

Вопрос «хужести» философский. do_! вырабатывает значение, try! - либо вырабатывает значение, либо выполняет нелокальный переход. Что проще понять?

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

Для вышеперечисленного есть Rust.

Хорошо хоть не Хаскель.

tailgunner ★★★★★
()

Лучше насилуйте С++, а Си и так прекрасен.

G0D
()

векторных типов int4, short8, uchar16, float4 и т.д.

Aazmp
()

Хочу все gnu-расширения в стандарт, особенно вычислимый goto и векторные типы.

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