Илья Ермаков писал(а):
Это слово используется только как флаг для компилятора.
Вот-вот...
Я пытался с помощью полей Kernel.Module.imports / Kernel.Module.nofimps получить список импорта - чего-то не понял результатов: для некоторых модулей результаты правильные, а для некоторых - нет. Определённо есть корреляция между присутствием в массиве Kernel.Module.imports значений NIL и импортом псевдомодулей. Хотя в обратную сторону, это не верно: если модуль импортировал псевдомодули, то не факт увидеть их или NIL в массиве Kernel.Module.imports.
Вобщем, если следующий код не печатает NIL-ы, то это еще не гарантирует того, что модуль на самом деле не импортирует псевдомодули:
Код:
MODULE TestSafeCheck;
IMPORT Kernel, Log, Meta;
PROCEDURE Check (IN name: ARRAY OF CHAR);
VAR m: Kernel.Module; i: INTEGER;
BEGIN m := Kernel.ThisMod(name);
IF m = NIL THEN Log.String("Модуль " + name + " не найден"); Log.Ln
ELSE
IF m.nofimps <= 0 THEN
Log.String("Модуль " + name + " ничего не импортирует"); Log.Ln
ELSE
Log.String(name + ": ");
FOR i := 0 TO m.nofimps - 1 DO
IF m.imports[i] # NIL THEN
Log.String(m.imports[i].name$); Log.String("; ");
ELSE
Log.String("NIL"); Log.String("; ");
END
END;
Log.Ln
END
END
END Check;
PROCEDURE Do*;
BEGIN
Check("Kernel");
Check("Meta");
Check("TestSafeCheck");
END Do;
END TestSafeCheck.
После выполнения TestSafeCheck.Do у меня печатается вот что:
Цитата:
Kernel: NIL; NIL; NIL; NIL; National;
Meta: Kernel; National;
TestSafeCheck: Kernel; Log; Meta;
Почему-то про модуль Meta "замалчивается" о том, что он тоже импортирует псевдомодуль, а про Kernel говорится как буд-то он импортирует всего 5 модулей (на самом деле 7).