(*~\Глагол\приложкемяLink\МПГ2009 (компилируется, но НЕ раб.?)\~~~~~~~~~~~~~~~*)
(**)                                                     ОТДЕЛ СРЕДА;
(******************************************************************************
 * НАЗНАЧЕНИЕ: среда для выполнения приложений на Сокращённом Глаголе (Малый ПГ)
 ******************************************************************************)

ИСПОЛЬЗУЕТ 
  ОБХОД,
   (*=
(*          \Глагол\                *)
  Текст   ИЗ "..\..\Отделы\Обмен\",  
   ОС     ИЗ "..\..\Отделы\Обмен\",          (* ОС.отд - ещё не компилируется *)
(*          \Глагол\                *)
    ВФайл ИЗ "..\..\Отделы\Обмен\ВводВывод\",
  НаЭкран ИЗ "..\..\Отделы\Обмен\ВводВывод\",
    =*)
  Ядро;

ВИД
(*
      Описатель Отдела (ОО) создаётся преобразователем в области постоянных
 *)
  ОпОтдела- = ДОСТУП К (*ВидОпОтдела;
                         ВидОпОтдела =*)
  НАБОР
    имя-      :Ядро.Имя;
    адресПер- :ЦЕЛ;  (* адрес переменных уровня отдела    *)
    адресУказ-:ЦЕЛ;  (* адрес первой задачи               *)
    адресКон- :ЦЕЛ;  (* адрес за последней задачей        *)
(*
    адресДВ-  :ЦЕЛ;  (* адрес ДВ переменных уровня отдела *)
    длинаДВ-  :ЦЕЛ;  (* длина ДВ переменных уровня отдела *)
    задачи-:РЯД 1 ИЗ (* начало ряда описания задач *)
      НАБОР
        нз-:ЦЕЛ; (* адрес начала задачи    *)
        нд-:ЦЕЛ; (* адрес начала ДВ задачи *)
      КОН
*)
  КОН;

ПЕР
  опОтделов:РЯД Ядро.Отделов ИЗ ЦЕЛ; (* адреса описателей отделов *)
  отделов  :ЦЕЛ; (* всего адресов описателей отделов *)

(***************************************************************************
 * Задачи, вызываемые из приложения неявным образом
 ***************************************************************************)
ЗАДАЧА Создать-(ов,размер,адрес+:ЦЕЛ);
(* Цель:  поддержка встроенных в Глагол задач:
 *        СОЗДАТЬ(<пер>+:вид)                      - для наборов и рядов
 *        СОЗДАТЬ(<пер>+:вид; <ДЛ1>,...,<ДЛn>:ЦЕЛ) - для открытых рядов
 * До:    <ов>     - описатель вида переменной <пер>
 *                   для рядов и открытых рядов <ов> = 0
 *        <размер> - размер данных у <пер>
 *                   для открытых рядов <размер> = 4+n*4+<ДЛ1>*...*<ДЛn>
 * После: <адрес>  - адрес выделенной памяти заполненной 0-ми,
 *                   четыре ячейки перед <адрес> всегда содержат <ов> *)
ПЕР
  уч:ЦЕЛ; (* адрес свободного участка *)
УКАЗ
  УВЕЛИЧИТЬ(размер,4); (* для ОВ *)
(*
  адрес:=ОС.ВзятьПамять(размер)
*)
  ОБХОД.ВПамять(адрес,ов);
  УВЕЛИЧИТЬ(адрес,4)
КОН Создать;

(******************************************************************************)
ЗАДАЧА Стоп-; 
(* Цель:  выполняется в конце работы приложения *)
УКАЗ
(*
  ОС.Спать(5000) (* 5с до закрытия окна *)
*)
КОН Стоп;

(******************************************************************************)
ЗАДАЧА Ловушка-(адрОО,кодстрока:ЦЕЛ);
(* Цель:  ловушка исключений *)
ПЕР
  ловушка,строка:ЦЕЛ;
  оо:ОпОтдела;
  текст:ЦЕПЬ[100];
(*
  поток:ВФайл.ДкПотоку;
*)
УКАЗ
  оо:=ОБХОД.Значение(ОпОтдела,адрОО);
  ловушка:=кодстрока ОСТАТОК Ядро.Ловушек;
  строка:=кодстрока ДЕЛИТЬ Ядро.Ловушек;
(*
  НаЭкран.ВсяЦепь('^Сработала ловушка в отделе "');
  НаЭкран.ВсяЦепь(оо.название);
  Текст.ИзЧЦел('" на строке %d.^Причина: ',строка,0,0,0,текст);
  НаЭкран.ВсяЦепь(текст);
*)
  ВЫБРАТЬ ловушка ИЗ
  | Ядро.лПределы:  текст:='выход значения за допустимые пределы'
  | Ядро.лНомер:    текст:='неверный номер переменной ряда'
  | Ядро.лАрифм:    текст:='арифметическое переполнение'
  | Ядро.лОхрана:   текст:='неверный размещённый вид'
  | Ядро.лПусто:    текст:='значение доступа "ПУСТО"'
  | Ядро.лДля:      текст:='у "ДЛЯ" нет "ИНАЧЕ"'
  | Ядро.лВыбрать:  текст:='у "ВЫБРАТЬ" нет "ИНАЧЕ"'
  | Ядро.лОтвет:    текст:='не определён ответ'
  | Ядро.лПроверить:текст:='"ПРОВЕРИТЬ" выдаёт ошибку'
  | Ядро.лНоль:     текст:='деление на ноль'
  | Ядро.лБегунок:  текст:='бегунок вне ряда'
  ИНАЧЕ
(*
    Текст.ИзЧЦел('ловушка %d',ловушка,0,0,0,текст)
*)
  КОН;
(*
  НаЭкран.ВсяЦепь(текст);
  НаЭкран.ВсяЦепь('.^Подробности см. в файле "Срез.пер".^');

  поток:=ВФайл.Открыть("Срез.пер");
  поток.цВидЗнаков:=ВФайл.знУни;

  ВФайл.ЦепьЗнаков(поток,текст);
  ВФайл.Закрыть(поток);
*)
  Стоп
КОН Ловушка;

КОН СРЕДА.
