OberonCore
https://forum.oberoncore.ru/

неэкспортированные процедурные типы -- проверяются
https://forum.oberoncore.ru/viewtopic.php?f=29&t=5448
Страница 1 из 1

Автор:  Info21 [ Воскресенье, 12 Июль, 2015 19:56 ]
Заголовок сообщения:  неэкспортированные процедурные типы -- проверяются

В одном модуле экспортированы процедурные переменные, но их (общий, объявленный отдельно) тип -- скрыт.

Тем не менее при компиляции внешнего модуля, который что-то присваивает этим переменным, проверка выполняется.

То есть я бы ожидал, что любое присваивание будет компилятором обламываться, -- ан нет:
если сигнатура присваиваемой процедуры соответствует невидимому типу, то компилятор присваивание пропускает.

Не могу придумать ситуацию, где такое поведение приводило бы к ошибке.

Но чисто эстетически -- как-то неэстетично.

Или чего-то не понимаю?

Автор:  Пётр Кушнир [ Воскресенье, 12 Июль, 2015 20:10 ]
Заголовок сообщения:  Re: неэкспортированные процедурные типы -- проверяются

Процедурным типам для совместимости достаточно совпадения набора параметров, насколько я понимаю, это общее место для многих языков. То есть неважно, какой именно тип у процедурной переменной, пусть даже и скрытый, для присвоения значения такой переменной должно быть достаточно совпадающего набора параметров. А иначе никак, ведь типизировать саму процедуру, которая будет реально выполняться мы не можем.

Автор:  Info21 [ Понедельник, 13 Июль, 2015 12:47 ]
Заголовок сообщения:  Re: неэкспортированные процедурные типы -- проверяются

Это-то понятно.

Непонятно, почему компилятор пропускает то, что -- в соответствии с принципом не/видимости -- пропускаться не должно.

Автор:  Пётр Кушнир [ Понедельник, 13 Июль, 2015 17:46 ]
Заголовок сообщения:  Re: неэкспортированные процедурные типы -- проверяются

Ну тут скорее наоборот, нельзя позволять экспортировать переменные со скрытым типом. Это и записей касается, и для записей похожая ситуация тоже прокатывает. Доступ к неизвестным интерфейсу объектам.

Код:
MODULE PrivTest;

   TYPE
      R = RECORD
         x*: INTEGER;
      END;
   
   VAR
      r*: R;
END PrivTest.

MODULE PrivTest2;
   IMPORT PrivTest;
BEGIN
   PrivTest.r.x := 10;
END PrivTest2.

Код:
DEFINITION PrivTest;

   VAR
      r: R;

END PrivTest.

Тонкий момент.

Автор:  Kemet [ Вторник, 14 Июль, 2015 19:27 ]
Заголовок сообщения:  Re: неэкспортированные процедурные типы -- проверяются

Идентификация типа процедурной переменной основано на соответствии сигнатуры, а не на соответствии имён, как для структурных записей, поэтому сигнатура типа экспортированных процедурных переменных всегда сохраняется, не нарушая общий принцип, так как по определению не структурна

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