parser

/faq/faq
/authors/авторы
/docs/документация

/powered_by_parser/в действии
/feedback/куда говорить
/jargon/жаргон

/download/скачать

/examples/примеры
/forum/форум



Поиск по форуму

По умолчанию ключевое слово ищется только в заголовке сообщения.

Ключевое слово:

Фильтровать по автору:



Как заменить for?

Sanja | bougakov@mailru.com 17.06.2001 19:03

"Дело было вечером, делать было нечего..."

Решил я тут написать на Парсере фичу для администрирования новостей. МайЭсКуЭля у меня нет, пришлось работать с файлами (а иначе было бы так просто...)

Тривиальная задача - реализуем ввод новой новости (скаламбурил, блин).

Формат новостей простой - заголовок, дата и текст. Чтобы отличать одну от другой, вводим ещё одно поле - её уникальный номер. По дате нельзя - в день может быть много новостей. Номера не идут по порядку - а вдруг я захочу новость между двумя существующими забить?

Когда мы заводим новость через веб-форму, хорошо бы убедиться, что новости с таким номером нету. Мы генерим число через ^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 и др?

<<  Вернуться к списку сообщений


E-mail: mailbox@parser.ruCopyright © 1997-2001 Студия Артемия Лебедева