Добавлена поддержка указателей и записей в CASE, введённой в пересмотре 2013 года сообщения о языке, и необходимой для эффективного перехода по указанным в ветвях типах.
MODULE Case; IMPORT log;
TYPE
Msg = RECORD END;
Start = RECORD(Msg) END;
Next = RECORD(Msg) exist: BOOLEAN; val: INTEGER END;
Sample = RECORD i: INTEGER END;
PROCEDURE Handle(VAR s: Sample; VAR m: Msg);
BEGIN
CASE m OF
Start: s.i := 0 |
Next: m.exist := s.i < 7; IF m.exist THEN m.val := s.i; INC(s.i) END
END
END Handle;
PROCEDURE Go*;
VAR s: Sample; start: Start; next: Next;
BEGIN
Handle(s, start);
Handle(s, next);
WHILE next.exist DO
log.in(next.val);
Handle(s, next)
END
END Go;
END Case.
Воплощение минимально необходимое — в качестве выражения в CASE допустимы лишь формальные параметры для записей и локальные переменные и параметры без VAR для указателей. Такое ограничение даёт и простоту воплощения, и гарантию невозможности подмены записи на несовместимое расширение уже после осуществления перехода по выбранному типу.
В текущей генерации переход по типу не оптимизирован — это простой последовательный поиск.
Комментариев нет:
Отправить комментарий