http://oberoncore.ru/_media/projects/bb ... deltas.pdfЦитата:
Ожидаемая логика по постусловию цикла:
1) done — один из фильтров выдал mod (результат получен, ничего не делать);
2) ~done & LegalName(name) — все фильтры отработали в холостую, имя "стандартное" — получить mod "стандартным" способом;
3) ~done & ~LegalName(name) — все фильтры отработали в холостую, имя "не стандартное" — "сбросить" mod.
Ошибка её выражения в Meta.Lookup приводит к тому, что (1) отрабатывает как (3).
Исправление:
Код:
PROCEDURE Lookup* (IN name: ARRAY OF CHAR; OUT mod: Item);
VAR m: Kernel.Module; done: BOOLEAN; filter: FilterHook;
BEGIN
done := FALSE; filter := filterHook;
WHILE ~done & (filter # NIL) DO filter.filter(name, mod, done); filter := filter.next END;
IF done THEN
ELSIF LegalName(name) THEN
…
ELSE SetUndef(mod)
END
END Lookup;