Len писал(а):
В языке нет встроенных операторов ввода/вывода, как например, в Basic`е оператор print. Как быть?
Всё правильно. А знаете почему в Оберон не введены операции ввода-вывода на уровне языка? Да чтобы не привязывать язык, например, к консольному вводу-выводу. Вместо этого Оберон — эдакая вещь в себе, и рассматривает ввод-вывод как нечто относящееся к уровню взаимодействия с внешней средой, т.е. то, что может быть решено средствами языка, например, отдельными модулями или биндингами к платформе/ОС. Согласитесь, что это плохо, когда ввод-вывод намертво привязан к 16-цветной консоли с разрешением 80x25 символов, и такая пристройка в виде консоли рассматривается как неотъемлемая часть языка, как это было в Turbo Pascal. Это то, что касается теории "зачем сделано именно так, а не иначе".
Как же практически достичь ввода-вывода?
Saferoll уже ответил насчёт BlackBox. Добавлю, что
существует модуль консольного вывода для Windows."Дубовые требования" стандартизируют процесс ввода-вывода, но они поддержаны далеко не всеми реализациями Оберона. Когда-то Руслан Богатырёв хотел разработать стандартные библиотеки ввода/вывода для основных реализаций Оберона/Компонентного Паскаля, но дело вроде бы далее идеи не сдвинулось. Так что каждая реализация решает этот вопрос по-разному. Мартин Райзер в своей книге "Programming in Oberon" предлагает такой интерфейс для вывода:
Код: "OBERON"
DEFINITION Out;
PROCEDURE Open;
PROCEDURE Char (ch: CHAR);
PROCEDURE String (str: ARRAY OF CHAR);
PROCEDURE Int (i, n: LONGINT);
PROCEDURE Real (x: REAL; n: INTEGER);
PROCEDURE LongReal (x: LONGREAL; n: INTEGER);
PROCEDURE Ln;
END Out.
XDS содержит свои библиотеки. В XDev/WinDev я использую для вывода модуль Console. На данный момент интерфейс выглядит примерно так:
Код: "OBERON"
DEFINITION Console;
PROCEDURE At (x: INTEGER; y: INTEGER);
PROCEDURE Clear (colors: INTEGER);
PROCEDURE SetColors (n: GrColors.Colors);
PROCEDURE SetFont (font: ARRAY [1] OF SYSTEM.BYTE);
PROCEDURE WriteCh (ch: CHAR);
PROCEDURE WriteHex (val: INTEGER);
PROCEDURE WriteInt (n: LONGINT);
PROCEDURE WriteIntWidth (x: INTEGER; n: INTEGER);
PROCEDURE WriteLn;
PROCEDURE WriteStr (str: ARRAY [1] OF CHAR);
PROCEDURE WriteStrLn (str: ARRAY [1] OF CHAR);
END Console.
Так что с вводом-выводом в Оберонах дела обстоят немного сложнее, чем хотелось бы. Просто ввод-вывод — он ведь разный бывает. И в графическое окно. И юникодный. И поверх рисунков, с прозрачностью. И векторными шрифтами. Так что пусть лёгкость вывода PRINT'ом в Basic'е Вас не обманывает. Всё равно люди вынуждены выйти за рамки возможностей PRINT (см., например, развитие Basic'а —
язык программирования Monkey).