‮Сдвиг по фазе (kincajou) wrote,
‮Сдвиг по фазе
kincajou

btstack (2)

в процессе написания своей реализации этого достославного протокола, столкнулся с принципиальным ограничением Си как языка программирования: на нём, таки да, нельзя написать функцию от аргумента, которая конструировала бы функцию, что-то делающую с этим аргументом. К читерскому приёму обработки необязательных аргументов (через троеточие которые, которые через va_list) все уже давно привыкли, но он всё равно читерский. Несмотря даже на то, что встроен в стандартную библиотеку. Но вот чтоб сделать функцию, возвращающую функцию.. нет, я не про передачу имени функции как указателя, совсем про другое.

Вот, скажем, практическая задача.

Нужно сделать изящный (в смысле, не пожирающий сотни флэши.. ну и красивый тоже, не без этого) разборщик хитрозавёрнутых пакетов данных, вызывающий в соответствии с полученными значениями разные обработчики - для каждого типа пакета чтоб свой. Разумеется, тут как не изворачивайся, но без порождения чудищ не обойтись: либо один монструозный обработчик с огромным блоком switch внутри, либо пучок мелких однозадачных обработчиков, висящих в каком-нибудь эдак вот сделанном списке (ну, например). И вот тут бы этот самый механизм очень пригодился бы, ибо с его помощью можно сильно упростить код: разборщик можно было бы сделать так, чтобы он возвращал САМИ ФУНКЦИИ, работающие с полученными данными. Но на Си это сделать невозможно и приходится варганить разборщик, ВЫЗЫВАЮЩИЙ эти функции (либо возвращающий какие-то указатели/идентификаторы, про каждый из которых надо помнить, с какими функциями они связаны и как оные функции вызывать!).

Разница есть. Причём существенная, хоть и не сразу очевидная.

Но увы, для маленьких ARM нету лиспа :(

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

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 10 comments