Ada: оператор не виден напрямую

Я использую среду разработки GNAT GPS studio, чтобы немного потренироваться в Ada. У меня проблема с видимостью пакета.

Сначала я указываю пакет в файле "DScale.ads", который содержит тип:

package DScale is 
   type DMajor is (D, E, F_Sharp, G, A, B, C_Sharp);
end DScale;

Затем я указываю в другом файле («Noteworthy.ads») пакет, который определяет процедуру, которая будет использовать тип DMajor пакета DScale:

with Ada.Text_IO;
with DScale;

package NoteWorthy is 
   procedure Note;
end NoteWorthy;

Наконец, в «Noteworthy.adb» я предоставляю тело пакета «Noteworthy»:

with Ada.Text_IO; use Ada.Text_IO;

package body Noteworthy is
   procedure Note is 
      package ScaleIO is new Enumeration_IO(DScale.DMajor);
      thisNote : DScale.DMajor := DScale.D;   
   begin
      ScaleIO.Get(thisNote);

      if thisNote = DScale.DMajor'First then 
         Put_Line("First note of scale.");
      end if;
   end Note;
begin
   null;   
end NoteWorthy;

Если я оставлю код как есть, я получу ошибку «оператор не виден напрямую» для оператора if thisNote = DScale.DMajor'First then в теле пакета «Noteworthy».

Есть ли способ обойти эту ошибку без использования предложения «use» или «use type»?

Спасибо.


person Constantine    schedule 31.08.2014    source источник


Ответы (3)


На ваш вопрос есть (как минимум) два ответа.

1:

if DScale."=" (thisNote, DScale.DMajor'First) then

2:

function "=" (Left, Right : DScale.DMajor) return Boolean renames DScale.DMajor;
...
if thisNote = DScale.DMajor'First then

Но зачем вам использовать один из этих вариантов вместо:

use type DScale.DMajor;
...
if thisNote = DScale.DMajor'First then
person Jacob Sparre Andersen    schedule 31.08.2014
comment
В Ada 2012 вы могли бы сказать use all type DScale.DMajor;, а затем if thisNote = D then .. но это дает вам только литералы, поэтому вам все равно нужно будет квалифицировать DScale.DMajor’First. - person Simon Wright; 01.09.2014

Типы Ada - это гораздо больше, чем просто описания значений, они представляют собой сущности, которые создают множество операций, воплощенных как в операторах, так и в атрибутах. Поэтому, если вы хотите, чтобы конкретный оператор "=" был виден напрямую, вы должны сделать его видимым. Для этого вам нужно либо «использовать», либо «использовать тип».

Зачем обходить языковую функцию? Просто используйте это с умом.

person Marc C    schedule 31.08.2014
comment
Причина в том, чтобы изучить все характеристики типов Ada, помимо представления данных в стиле перечисления. Спасибо за ваш ответ :) - person Constantine; 01.09.2014

Пара моментов, связанных со структурой вашего кода.

В спецификации пакета для Noteworthy нет необходимости «с DScale», поскольку в спецификации нет ничего, что относилось бы к какой-либо функции в этом пакете (возможно, вы планируете это сделать в будущем).

Использование enumeration_io хорошо, если вы хотите просто выполнять ввод-вывод для файлов, которые будут прочитаны компьютером, но я бы никогда не стал использовать его для взаимодействия с человеком (кроме быстрых взломов). Принимаемые входные значения определяются грамматикой Ады, а не тем, чего ожидает пользователь.

person Dale Stanbrough    schedule 02.09.2014