OberonCore
https://forum.oberoncore.ru/

Видимость структур структур через границы модулей
https://forum.oberoncore.ru/viewtopic.php?f=29&t=6638
Страница 1 из 1

Автор:  adimetrius [ Четверг, 16 Июль, 2020 16:13 ]
Заголовок сообщения:  Видимость структур структур через границы модулей

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

Это, с одной стороны, подчеркивает, что тип и имя типа - разные субстанции.

С другой стороны - какова практическая ценность такой особенности? Кто-нибудь пользовался этим осознанно? Как полагаете, почему так сделано: так вышло? так легче сделать компилятор? или есть какая-то иная целесообразность?

Автор:  Александр Ильин [ Суббота, 18 Июль, 2020 12:02 ]
Заголовок сообщения:  Re: Видимость структур структур через границы модулей

Вы можете иметь доступ к опубликованным полям записи, но не можете объявлять свои экземпляры типа записи или процедуры с их использованием. Это даёт модулю, где этот тип S объявлен, гарантии того, что все экземпляры данного типа созданы только им, и, соответственно, соблюдены все необходимые инварианты, в том числе касательно неопубликованных полей.

Если объявить тип-запись публичной, а затем другой модуль объявит где-то в процедуре локальную переменную этого типа и передаст её в ваш модуль, то в неопубликованных полях (неуказательного типа) может быть мусор со стека.

Я этим пользовался, но уже не помню, где и как.

Автор:  adimetrius [ Суббота, 18 Июль, 2020 13:16 ]
Заголовок сообщения:  Re: Видимость структур структур через границы модулей

Александр Ильин писал(а):
Это даёт модулю, где этот тип S объявлен, гарантии того, что все экземпляры данного типа созданы только им, и, соответственно, соблюдены все необходимые инварианты, в том числе касательно неопубликованных полей.


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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/