А что убого-то? Я считаю, что у меня скрипт описания структуры файла данных неплохой. Легко читается, допускает всевозможные проверки, контроль ошибок и тд. Главное — мне нравится то, что я делаю. Это не тяжкий труд, это радость творчества.
Вы будете смеяться, но я пишу с использованием разработанной технологии еще один вЕлик. Библиотеку чтения JSON. Примерно так выглядит это самое чтение в программе:
OBJECT("")
{
VALUE("Comment", Header.Comment);
VALUE("Count", Header.Count);
OBJECT("DiskParam")
{
VALUE("DB", Header.DB);
VALUE("DBAngle", Header.DBAngle);
}
VALUE("Range", Header.Range);
//Чтение массива с неизвестным числом элементов
ARRAY_WHILE("Blades", BladeCount)
{
TBlade Blade;
OBJECT("")
{
VALUE("Caption", Blade.Caption);
VALUE("Value", Blade.BaseChar);
}
if(!ERROR)
{
NewBlades=realloc(Blades, BladeCount+1);
if(NewBlades)
{
Blades=NewBlades;
Blades[BladeCount]=Blade;
}
}
}
//Чтение массива с известным или ограниченным числом элементов
ARRAY_FOR("Slots", SlotsCount, MAX_ELEMENTS)
VALUE("", Slots[SlotsCount]);
//Обработка ситуаций, когда значение может быть неподходящего типа
double Temp;
VALUE("NCount", Temp)
Header.NCount=(int)(Temp+0.5);
}
Я просто уверен, такого синтаксиса вы еще нигде не видели :). Имеет смысл писать статью или снова заминусуете велосипедиста?
Ого! В такой размер исходника я не помещусь, даже если максимально выжать из него всю воду. Но за первенство по размеру исполняемого файла вполне поборюсь, предполагаю влезть в 4Кб.
Забавный язык, спасибо за комментарий.
Я знаю про эти сложности, но не старался затащить сюда полную реализацию. Наоборот, резал код как можно компактнее. Только необходимое для иллюстрации совершенно оригинального подхода к формированию XML-подобных документов.
Эх, если бы я умел делать #define FOO(...) с переменным числом аргументов, то можно было бы еще красивее забацать. В JSONе можно использовать null в качестве значения, так и напрашивается сделать его через VALUE(«Key»), а вот фиг. Но я еще работаю над этой проблемой ;).
Еще очень напрягает, что нельзя нормально перегрузить функции TJsonTagCloser::Write***. Используются-то его наследники, не в каждом же перегружать. Тоже думаю, как сделать красиво.
Я с этим согласен. Но я непрофессиональный программист, поэтому такие задачи для меня скорее тренировка и даже что-то вроде хобби. У меня редко получается хороший код, но тут, похоже, исключение. Если честно, то сам офигел от чистоты и естественности скрипта описания формата данных, насколько хорошо в него вписываются конструкции С++. Собственно поэтому и рискнул показать общественности.
Я просто уверен, такого синтаксиса вы еще нигде не видели :). Имеет смысл писать статью или снова заминусуете велосипедиста?
Забавный язык, спасибо за комментарий.
Еще очень напрягает, что нельзя нормально перегрузить функции TJsonTagCloser::Write***. Используются-то его наследники, не в каждом же перегружать. Тоже думаю, как сделать красиво.