Страницы

воскресенье, 30 января 2022 г.

CASE для указателей и записей

Добавлена поддержка указателей и записей в 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 для указателей. Такое ограничение даёт и простоту воплощения, и гарантию невозможности подмены записи на несовместимое расширение уже после осуществления перехода по выбранному типу.

В текущей генерации переход по типу не оптимизирован — это простой последовательный поиск.

Комментариев нет:

Отправить комментарий

Обработка ошибок

Тема корректной обработки ошибок в программе является довольно сложным вопросом в программировании. Отчасти от того, что и она сама являет...