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 вообще нигде, даже для очистки ресурсов при ошибке. Так заживём, ЛОР!

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

Как только нужны строки длинней ограничения счётчика, что нужно чуть менее, чем всегда, начинается тотже онанизм с указателями,

В FPC ограничение 4 гигабайта (32 бита на счётчик). Это покрывает 99.99% использования строк.

Нормальных, если в смысле в которых можно ходить как по массиву символов, то нет (wchar_t и весь этот мультибайт ИМХО == боль).

В поцкале есть Utf8String. Во всяких хацкеллах и прочих рустах тоже.

Другой вопрос, что да, хер знает что считать символом. ü – это один символ или два? Потому что может быть записан и так и так.

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

В FPC ограничение 4 гигабайта

Вот именно, что только в FPC. В паскале «вообще», насколько я в курсе, этот момент не истолкован и в конкретном компиляторе может быть размер и 255 на строку.

В поцкале есть Utf8String. Во всяких хацкеллах и прочих рустах тоже.

Так я следующим предложением это и написал.

Потому что может быть записан и так и так

В частности поэтому в большинтве языков и нельзя манипулировать строками «побайтово» в стиле Си. Только разной стоимости рантайм обёртки.

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

В FPC ограничение 4 гигабайта

То есть в строке из пары символов больше половины занимает счетчик? Какой ужас.

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

в конкретном компиляторе может быть размер и 255 на строку.

В каком именно? Их сейчас живых ровно два: FPC и Delphi. И что-то мне кажется, второй тоже такими проблемами не страдает.

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

Глянул в доку Embarcadero. Там вообще всё весело. Т.е.

  • старые, которые раньше были String, теперь ShortString,
  • неюникодные, про которые ты говоришь - AnsiString,
  • wchar - WideString
  • дефолтный UnicodeString (на который теперь тип string алиасится)
  • C-style PChar/PWideChar тоже никто не отменял.

Кратко, резюмируя - полная задница. Однако, если обойтись дефолтными string (алиас UnicodeString), то в принципе, даже и неплохо.

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

Глянул в доку Embarcadero. Там вообще всё весело. Т.е.

Знаешь, очень похоже на нынешнюю ситуацию в Rust. Там вот ровно то же самое.

Кратко, резюмируя - полная задница. Однако, если обойтись дефолтными string (алиас UnicodeString), то в принципе, даже и неплохо.

Ну да, так и должно быть. Дефолтный сценарий для 99% случаев плюс специальные штуки. Всё ок.

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