Информация об изменениях

Сообщение Re[2]: Closures in plain C. от 14.12.2021 15:17

Изменено 14.12.2021 15:21 fk0

Re[2]: Closures in plain C.
Здравствуйте, kov_serg, Вы писали:

_>Что мешает использовать менеджер ресурсов, который будет следить за выделением ресурсов и он же будет их освобождать.

_>Выглядеть будет примерно так
_>
_>static void body_code(scope_t *s) {
_>  void *p, *q; mutex_t m[1];
_>  p=scope_mem_alloc(s,25);
_>  if (scope_mutex_lock(s,m)) return;
_>  q=scope_mem_alloc(s,25);
_>}
_>void body(scope_t *s) {
_>  scope_exec(s,body_code);
_>}
_>


Это хорошо работало бы в языках, где есть лямбды. Или даже в обычном (Turbo) паскале,
где есть понятие вложенных функций. А в голом C неудобно, так как логика разбивается
на большое количество функций, где за логикой собственно уже и не уследить. Ведь
для каждого вложенного scope нужна отдельная функция.

В C есть лямбды, но это или бестолковое GCC-расширение добавляющее вложенные
функции (с трамплинами, исполняемым стеком...), либо "Blocks" из clang. Т.е. все
подобного рода расширения, к сожалению, специфические только для одного конкретного
компилятора.
Re[2]: Closures in plain C.
Здравствуйте, kov_serg, Вы писали:

_>Что мешает использовать менеджер ресурсов, который будет следить за выделением ресурсов и он же будет их освобождать.

_>Выглядеть будет примерно так
_>
_>static void body_code(scope_t *s) {
_>  void *p, *q; mutex_t m[1];
_>  p=scope_mem_alloc(s,25);
_>  if (scope_mutex_lock(s,m)) return;
_>  q=scope_mem_alloc(s,25);
_>}
_>void body(scope_t *s) {
_>  scope_exec(s,body_code);
_>}
_>


Это хорошо работало бы в языках, где есть лямбды. Или даже в обычном (Turbo) паскале,
где есть понятие вложенных функций. А в голом C неудобно, так как логика разбивается
на большое количество функций, где за логикой собственно уже и не уследить. Ведь
для каждого вложенного scope нужна отдельная функция.

Вдогонку, важное забыл. Для лямбды так или иначе важен КОНТЕКСТ. Который она
автоматически захватывает. А в данном случае функция body_code вынуждена
контекст принимать в аргументах. Так программировать в целом крайне неудобно...

В C есть лямбды, но это или бестолковое GCC-расширение добавляющее вложенные
функции (с трамплинами, исполняемым стеком...), либо "Blocks" из clang. Т.е. все
подобного рода расширения, к сожалению, специфические только для одного конкретного
компилятора.