Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
44
Добавлен:
23.03.2015
Размер:
884 Кб
Скачать
☆

110 Глава 5

На рис. 5.1 показаны спецификации процедур choose и search.

choose = proc (s: intset) returns (int) signals (empty)

effects Если size (s) = 0, то сигнализировать об исключительной ситуа­ции empty, иначе возвратить произвольный элемент s.

search = proc (a: array [int], х: int) returns (ind: int) signals (notJn, duplicate (iridi: int))

requires Массив а упорядочен в возрастающем порядке. effects Если х ^ а один раз, то возвратить ind, такой, что a find] == х; Если х ^ а более чем один раз, то сигнализировать об исключительной ситуации duplicate (indi), где indi —индекс для одного из х; иначе— сигнализировать об исключительной ситуации not_in.

Рис. 5.1. Спецификации с исключительными ситуациями.

Заметим, что спецификация процедуры search содержит предложе­ние requires и что, как обычно, в секции effects предполагается, что все требования предложения requires удовлетворены. Область определения процедуры search есть

Do = {(а, х> di = {(а, х D» = {(а, х<)

х ^ а ровно один раз) х^а) х $ а более чем один раз}

Здесь подмножества области определения стоящие из массива и целого числа.

это пары, со-

5.2. Механизм исключительных ситуаций в языке CLU

Язык программирования может сделать работу о исключи­тельными ситуациями легкой, если он включает в себя механизм исключительных ситуаций. Этот механизм должен обеспечивать для процедуры возможность сигнализировать об исключительных ситуациях, т. е. доводить их возникновение до сведения исполь­зующего процедуру. Кроме того, эту информацию должна быть способна получать вызывающая процедура, чтобы обрабатывать исключительные ситуации. Однако вызывающая процедура не должна обрабатывать исключительные ситуации, которые не могут возникнуть. Например, предположим, что мы выполняем следующую операцию:

И intset$size (s) £> 0 then х := intset$choose (s) end

Будет странно, если обращение к процедуре choose сигнали­зирует нам об исключительной ситуации empty. Для программиста нет необходимости обрабатывать исключительные ситуации в по­добных случаях.

Исключительные ситуации

6.2.1. Сигнализация об исключительных ситуациях

Процедура, написанная на языке CLU, может завершить работу по одному из некоторого количества условий. В ее заго^ ловок включены имена исключительных ситуаций и определены число и типы результатов, возвращаемых в каждом случае. На­пример, имеем заголовок

choose = proc (s: intset) returns (int) signals (empty) search = proc (a: array [int], х: int) returns (int)

signals (not_in, duplicate (int))

При «обычном» завершении работы этой процедуры она вы­ходит либо на конец своего тела программы, либо на оператор return. Для завершения работы с исключительной ситуацией «имя» процедура использует предложение signal

signal имя (выражение)

Предложение signal верно, только если имя исключительной ситуации указано в заголовке процедуры (или есть failure, что рассматривается в разд. 5.2.4). На рис. 5.2 представлена иллю­стрирующая сигнализацию реализация процедуры choose. Здесь мы предполагаем, что используется реализация intset, представ­ленная на рис. 4.5.

rep = array [inf ]

choose == proc (s: cvt) returns (int) signals (empty) if rep$size (s) •= 0 then signal empty end return (rep$bottom (s)) end choose

Рис. 5.2. Реализация процедуры choose.

Соседние файлы в папке POSIBNIK