OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 29 Март, 2024 12:16

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
СообщениеДобавлено: Четверг, 16 Июль, 2020 16:13 
Аватара пользователя

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

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Вы можете иметь доступ к опубликованным полям записи, но не можете объявлять свои экземпляры типа записи или процедуры с их использованием. Это даёт модулю, где этот тип S объявлен, гарантии того, что все экземпляры данного типа созданы только им, и, соответственно, соблюдены все необходимые инварианты, в том числе касательно неопубликованных полей.

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 18 Июль, 2020 13:16 
Аватара пользователя

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


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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB