Прошу пояснить уважаемых знатоков, почему работает указанный код,
хотя в модуле
(System)Files имеются только абстрактные определения для объектов Writer/Reader/File:
Код:
MODULE Files;
IMPORT Kernel;
.....
PROCEDURE (f: File) Length* (): INTEGER, NEW, ABSTRACT;
PROCEDURE (f: File) NewReader* (old: Reader): Reader, NEW, ABSTRACT;
PROCEDURE (f: File) NewWriter* (old: Writer): Writer, NEW, ABSTRACT;
PROCEDURE (f: File) Flush* (), NEW, ABSTRACT;
PROCEDURE (f: File) Register* (name: Name; type: Type; ask: BOOLEAN; OUT res: INTEGER), NEW, ABSTRACT;
PROCEDURE (f: File) Close* (), NEW, ABSTRACT;
PROCEDURE (r: Reader) Base* (): File, NEW, ABSTRACT;
PROCEDURE (r: Reader) Pos* (): INTEGER, NEW, ABSTRACT;
PROCEDURE (r: Reader) SetPos* (pos: INTEGER), NEW, ABSTRACT;
PROCEDURE (r: Reader) ReadByte* (OUT x: BYTE), NEW, ABSTRACT;
PROCEDURE (r: Reader) ReadBytes* (VAR x: ARRAY OF BYTE; beg, len: INTEGER), NEW, ABSTRACT;
PROCEDURE (w: Writer) Base* (): File, NEW, ABSTRACT;
PROCEDURE (w: Writer) Pos* (): INTEGER, NEW, ABSTRACT;
PROCEDURE (w: Writer) SetPos* (pos: INTEGER), NEW, ABSTRACT;
PROCEDURE (w: Writer) WriteByte* (x: BYTE), NEW, ABSTRACT;
PROCEDURE (w: Writer) WriteBytes* (IN x: ARRAY OF BYTE; beg, len: INTEGER), NEW, ABSTRACT;
Код:
MODULE ExamplesReadFile;
IMPORT Log, Files;
PROCEDURE ReadFileBytes*;
VAR file: Files.File; reader: Files.Reader; b: BYTE;
BEGIN
file := Files.dir.Old(Files.dir.This("c:\"), "file.txt", FALSE);
IF file # NIL THEN
reader := file.NewReader(NIL);
IF reader # NIL THEN
(* ASSERT(~reader.eof); *)
reader.ReadByte(b);
WHILE ~reader.eof DO
Log.Int(b); Log.Ln;
reader.ReadByte(b)
END;
(* ASSERT(reader.eof) *)
ELSE
Log.String("Error on open file reader."); Log.Ln
END;
file.Close
ELSE
Log.String("File open error."); Log.Ln
END
END ReadFileBytes;
END ExamplesReadFile.
Почему модуль
(System)Files неявно подменяется на
(Host)Files ?
Есть специальное правило на этот счет ?