|
|
|
Как заменить for?
"Дело было вечером, делать было нечего..."
Решил я тут написать на Парсере фичу для администрирования новостей. МайЭсКуЭля у меня нет, пришлось работать с файлами (а иначе было бы так просто...)
Тривиальная задача - реализуем ввод новой новости (скаламбурил, блин).
Формат новостей простой - заголовок, дата и текст. Чтобы отличать одну от другой, вводим ещё одно поле - её уникальный номер. По дате нельзя - в день может быть много новостей. Номера не идут по порядку - а вдруг я захочу новость между двумя существующими забить?
Когда мы заводим новость через веб-форму, хорошо бы убедиться, что новости с таким номером нету. Мы генерим число через ^random и проверяем с помощью ^ifdef[^locate[no;^random[100000 не встречается ли оно у нас. Если встречается, пробуем ещё раз и ещё, если нужно. Диапазон-то - пять знаков, чего-нибудь да найдём.
Начинаем реализовывать - берём мануал и начинаем искать описание оператора ^for ... которого, оказывается, там нету.... Облом...
Чешем репу и начинаем извращаться. В голову приходит идея - можно вынести проверку совпадения в маленький макрос, который будем вызывать через ifdef столько раз, сколько понадобится.# генерируем случайное число и смотрим,
# нет ли у нас уже такого. Если не получается,
# пробуем ещё разок.. и ещё...
^context[news;
^load[named;/news.cfg]
^empty[Ошибка;
^macro_new[seeknum[number];
^ifdef[^locate[no;$number];
$number;
^macro[seeknum;^random[10000]]
# вызов макроса из самого себя
]
]
var[newarticleid;^macro[seeknum;^random[10000]]]
]
]и получаемvar[newarticleid; [infinite operator recursion detected] ] .. оказывается, макрос сам себя рекурсивно вызвать не может. Второй облом - это уже начинает входить в традицию, nicht wahr?
Вопрос к общественности - как обойтись без отсутствующего ^for и рекурсии?
Вопрос к девелоперам - будет ли ^for в новой версии парсера? А также while и др?
|