У меня есть опыт работы с языками высокого уровня, такими как Java / Kotlin / Scala.Теперь мне нужно создать библиотеку C, но мне довольно сложно работать без замыканий.
В GCC есть замечательное расширение, называемое "вложенными функциями", которое (если я правильно понял) - именно то, что мне нужно.Также интересным выглядит расширение «блоков» Apple.Но мне нужен код, который будет работать с любым компилятором.
Имеется ли какое-либо существующее решение?Я видел несколько проектов, которые позволяют генерировать код на C: https://github.com/dbohdan/compilers-targeting-c. Но мне действительно не нужен другой язык, только одна особенность - замыкания.(Я думаю, что трудно поддерживать совершенно другой язык, и результат кода на C не будет оптимизирован).
UPD Некоторое объяснение, зачем мне замыкания.
Позвольтескажем, у нас есть какая-то функция, connect(void (*on_failed_callback)());
.Он каким-то образом управляет соединением, а когда соединение теряется, он вызывает обратный вызов.И это принимает 0 аргументов, но я хочу создать некоторую функцию, которая будет приносить некоторые данные с обратным вызовом.Если я правильно понял, наиболее часто используемое решение - передать обратный вызов с некоторым аргументом connect(void (*on_failed_callback)(void *callback_arg), void* arg);
.Но это приводит к шаблонному коду, который может быть исправлен вложенными функциями.
Итак, следующий код:
void connect(void (*on_failed_callback)(void* arg), void* arg) {
...
on_failed_callback(arg);
}
void print_error(char* error) {
printf(error);
}
void main() {
char *msg = "Failed connection";
...
connect(print_error, msg);
}
Можно упростить до следующего:
void connect(void (*on_failed_callback)()) {
...
on_failed_callback();
}
void print_error(char* error) {
printf(error);
}
void main() {
char* msg = "Failed connection";
...
void callback() {
print_error(msg);
}
connect(callback);
}
Я имею в виду, мне нужен какой-нибудь инструмент / приложение, которое анализирует мой код с помощью замыканий / вложенных функций и генерирует чистый код ANSI C.