D1. Команды
Команда - это любая процедура P, которая экспортируется модулем M и не имеет параметров. Она обозначается M.P и может быть активирована под таким именем из оболочки операционной системы. В Обероне пользователь вызывает команды вместо программ или модулей. Это дает лучшую структуру управления и предоставляет модули с несколькими точками входа. Когда вызывается команда M.P, модуль M динамически загружается, если он уже не был в памяти (см. D2) и выполняется процедура P. Когда P завершается, M остается загруженным. Все глобальные переменные и структуры данных, которые могут быть достигнуты через глобальные переменные-указатели в M, сохраняют значения. Когда P (или другая команда M) вызывается снова, она может продолжать использовать эти значения.
Следующий модуль демонстрирует использование команд. Он реализует абстрактную структуру данных Counter, которая содержит переменную-счетчик и обеспечивает команды для увеличения и печати его значения.
MODULE Counter;
IMPORT Texts, Oberon;
VAR
counter: LONGINT;
w: Texts.Writer;
PROCEDURE Add*; (* получает числовой аргумент из командной строки *)
VAR s: Texts.Scanner;
BEGIN
Texts.OpenScanner(s, Oberon.Par.text, Oberon.Par.pos);
Texts.Scan(s);
IF s.class = Texts.Int THEN INC(counter, s.i) END
END Add;
PROCEDURE Write*;
BEGIN
Texts.WriteInt(w, counter, 5); Texts.WriteLn(w);
Texts.Append(Oberon.Log, w.buf)
END Write;
BEGIN counter := 0; Texts.OpenWriter(w)
END Counter.
Пользователь может выполнить следующие две команды:
Counter.Add n Добавляет значение n к переменной counter
Counter.Write Выводит текущее значение counter на экран
Так как команды не содержат параметров, они должны получать свои аргументы из операционной системы. Вообще команды вольны брать параметры отовсюду (например из текста после команды, из текущего выбранного фрагмента или из отмеченного окна просмотра). Команда Add использует сканер (тип данных, обеспечиваемый Оберон-системой) чтобы читать значение, которое следует за нею в командной строке.
Когда Counter.Add вызывается впервые, модуль Counter загружается и выполняется его тело. Каждое обращение Counter.Add n увеличивает переменную counter на n. Каждое обращение Counter.Write выводит текущее значение counter на экран.
Поскольку модуль остается загруженным после выполнения его команд, должен существовать явный способ выгрузить его (например, когда пользователь хочет заменить загруженную версию перекомпилированной версией). Оберон-система содержит команду, позволяющую это сделать.