Тут буквально на днях я работал над webassembly в JavaScriptCore. JavaScriptCore это движок для JS и webassembly в webkit, который используется в браузере safari. Я собирался поддержать новый формат кодирования секции element в wasm, т.е. мне просто надо было поправить парсер.
Я уже привык что код на c++, да еще и в больших проектах не блещет новыми идеями и фишками из новых стандартов, развитие происходит неспеша и очень консервативно, но когда я нашел нужную мне функцию parseElement() я уже смотрел с презрением...
Посмотрите на эту кучу макросов: webkit-search.igalia.com/webkit/source/…,
WASM_PARSER_FAIL_IF(!parseVarUInt32(elementCount), "can't get Element section's count");
Несмотря на макросы это почти читабельно, исключая того что под WASM_PARSER_FAIL_IF может скрыться нетривиальный кусок кода.
Спустя буквально пару часов я прозрел, блин, а это удобно. Не надо как в Go писать каждый раз if not error, просто в случае ошибки указываешь что возвращать и все.
Посмотрите как функция объявлена, auto SectionParser::parseElement() -> PartialResult, это же в прямом виде rail way oriented development в c++. Более подробно об этом подходе можно прочитать тут: fsharpforfunandprofit.com/rop/.
Также Андрей Александреску предлагал внести похожий способ обработки ошибок в c++: youtube.com/watch?v=CGwk3i….
Возвращаясь к своей задаче я написал пару функций для парсинга в стиле:
PartialResult WARN_UNUSED_RETURN parseElemKind(uint8_t& elemKind), потом вызвал их через этот чудесный макрос, который по факту делает if и все, код получается читаемым, расширяемым и вот это вот все.
Вот к слову и патч в JSC который добавляет поддержку обновленной секции elements и reference-type proposal: bugs.webkit.org/attachment.cgi….