Коллеги, я вчитывался в Сообщение о языке СЯ, и пришел к такому выводу: СЯ определяет, что экспортированный идентификатор может использоваться в импортирующих модулях.
LR писал(а):
An identifier x exported by a module M may be used in other modules, if they import M.
Больше других ограничений нет (я не обнаружил). Получается, что если Т - не экспортированное имя типа-записи, в котором экспортировано поле f - то последнее будет доступно в клиентских модулях:
Код:
MODULE M;
TYPE
T = ARRAY 16 OF CHAR;
S = RECORD f*: CHAR END;
VAR
v*: T;
u*: S;
END M.
MODULE B;
IMPORT M;
CONST L = LEN(M.v);
BEGIN
M.u.f := "Z"
END B.
И вообще свойства структуры, обозначенной T, будут доступны в клиентах - напр длина массива.
Оказалось, компилятор CP2 Того же мнения: приведенный пример скомпилирован без ошибок.
Это, с одной стороны, подчеркивает, что тип и имя типа - разные субстанции.
С другой стороны - какова практическая ценность такой особенности? Кто-нибудь пользовался этим осознанно? Как полагаете, почему так сделано: так вышло? так легче сделать компилятор? или есть какая-то иная целесообразность?