Uzix | микроблог

Лямбды в Си

Есть два пути получения лямбд в Си:

  1. Использовать дополнительный препроцессор cmacro. Идея очень интересная, но, к сожалению, реализация подводит. У меня этот препроцессор не только спотыкался на простейших конструкциях (например, лямбда, возвращающая указатель), но и умудрялся портить совершенно сторонний код (“return -1” чудесным образом превращается в “return- 1”). Проект по всей видимости заброшен.

  2. Использовать расширения компилятора GCC. Это простой и безболезненный путь если нет необходимости сохранять совместимость с другими компиляторами. Для этого варианта достаточно объявить макрос:

#define lambda(l_ret_type, l_arguments, l_body)         \
  ({                                                    \
    l_ret_type l_anonymous_functions_name l_arguments   \
      l_body                                            \
    &l_anonymous_functions_name;                        \
  })

Пример создания и использования лямбды:

    printf("%s world\n", lambda(char*, (void), { return "Hello"; } )() );

Обратите внимание: GCC волен размещать код вложенных функций (и, как следствие, лямбд) в стеке!

Комментарии