Семантика объявления типа Ада

Я беру Аду в колледж. Сегодня мой профессор задал нам вопрос. В следующем фрагменте кода есть три объявления типа. Третий не компилируется с ошибкой «отсутствует новый».

Я предполагаю, что ключевое слово «Тип» позволяет компилятору узнать, что мы собираемся определить класс хранения, поэтому мои вопросы:

каковы семантические различия между объявлениями?
Если ключевое слово Integer опущено, предполагает ли Ада универсальный целочисленный тип, когда указан диапазон? Это кажется очевидным и логичным результатом. Кроме того, когда ключевое слово «Целое число» перед «диапазоном» является новым, тогда требуется?

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

with Ada.Text_IO; use ada.Text_IO;
    procedure any is
    type abc is new Integer range 1..10;
    num : abc;
    type def is range 1..10;
    num2 : def;
    type xyz is Integer range 1..10;
    num3 : xyz;
      begin
      num := 5;
      num2 := 6;
      num3 := 7;
 end any;

person Michael Riley    schedule 06.03.2017    source источник
comment
Еще несколько слов о Integer: как уже было сказано, вызов Integer ключевого слова может немного сбить с толку, потому что это просто имя, в то время как ключевые слова обычно зарезервированы для правильного синтаксиса или других специальных целей, кроме именования. type и end относятся к этому типу. Integer — это имя совершенно нормального подтипа, определенного в библиотеке Ада. Этот тип Integer обычно используется с другими библиотечными подпрограммами. Таким образом, определение таких типов, как def, как вы сделали, в самый раз.   -  person B98    schedule 08.03.2017


Ответы (1)


В первом объявлении вы объявляете новый тип, отличный от Integer, но наследующий от него несколько свойств (например, примитивные функции и операторы, но это не имеет значения).

Во всех практических вопросах типы abc и def в этом случае семантически эквивалентны. Однако если бы у вас были примитивные операции над вашим базовым типом, все было бы иначе.

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

Теперь xyz просто неверно, и Integer здесь ничего не значит. Это может означать одно из двух:

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

Кроме того, когда ключевое слово «Целое число» перед «диапазоном» является новым, тогда требуется?

Integer — это не ключевое слово, это тип, определенный в стандартном пакете. В этой декларации

type A is Integer range 1 .. 10;

Integer — это ссылка на тип, которого Ада не ожидает. Ожидается либо определение типа, либо базовый тип.

person raph.amiard    schedule 06.03.2017
comment
Спасибо, что нашли время, чтобы объяснить это, а также прояснили. Я неправильно понимал несколько вещей одновременно, так что это было весьма полезно. - person Michael Riley; 07.03.2017
comment
Нет проблем :) Рад, что это помогло! - person raph.amiard; 07.03.2017