> -- Александр Ильин писал(а):
> Не совсем про выход из середины цикла, но про выход из середины процедуры. Сегодня переписал вот такую процедурку.

Проблема этой процедурки не в ретурнах (кстати, по мне так ваш вариант еще менее читабельный), а в том, что она оперирует несвязанными между собой сущностями - pg.base.bmh, pg.Load^(), AllocNew(pg). Без знания, как работает AllocNew, как работает Load и как они связаны с pg.base.bmh понять, что тут на самом деле творится - невозможно. Как не переписывай ретурны и ифы
Сделаю предположение (хотя еще раз подчеркну, что из кода это совершенно неочевидно), что AllocNew грузит bmp'ку в pg.base.bmh используя "что-то", полученное после вызова pg.Load^ (). Тогда я бы переписал этот код так:
## Код:
```
IF pg.base.bmh = NIL THEN
        hz := pg.Load^ () (* что делает Load в оригинальном варианте и каким он боком к остальному коду - вообще непонятно *)
        IF hz # NIL THEN
            pg.base.bmh := AllocNew(hz); (*теперь AllocNew _явно_ зависит от предыдущего вызова Load, а первое условие (pg.base.bmh = NIL) обретает смысл - теперь видно, что эта функция делает (грузит bmp в pg.base.bmh, если она еще не была загружена). *)
        END
    END
    RETURN pg.base.bmh # NIL
```


> -- Александр Ильин писал(а):
> PS: Проверка "... # NIL" имеет здесь смысл "уже загружено".

...и такого комментария уже не требуется

P.S. Я ж говорю - циклы с break и прочие ретурны из середины - это фигня. Даже если отбросить архитектурные аспекты и сосредоточится исключительно на кодировании "в малом" - есть намного более интересные и важные аспекты, влияющие на сопровождение кода, чем следование/неследование принципам Дейкстры.