Рекурсивная видимость символов в пакетах Ada

Допустим, у меня есть общая библиотека векторов. Чтобы упростить использование, я хочу создать различные распространенные формы векторной библиотеки и сделать их видимыми в одном пакете.

Я пытаюсь это:

with GenericVector;

package Vectors is
    package Vectors3 is new GenericVector(3);
    use all type Vectors3.Vector;
    subtype Vector3 is Vectors3.Vector;

    package Vectors4 is new GenericVector(4);
    use all type Vectors4.Vector;
    subtype Vector4 is Vectors4.Vector;
end;

Конечная цель заключается в том, что я хочу быть в состоянии сделать with Vectors; use Vectors; и в конечном итоге Vector3 а также Vector4 типы, доступные непосредственно, которые просто работают.

Естественно, код выше не работает. Похоже, use all type операторы импортируют определения, прикрепленные к указанному типу, в спецификацию пакета, но затем эти определения не экспортируются пользователю Vectors, я должен сделать with Vectors; use Vectors; use all type Vectors.Vectors3; вместо. Это вроде отстойно.

Как я могу это сделать?

2 ответа

Решение

Вы могли бы просто сделать Vector3 а также Vector4 новые типы, а не только подтипы. Это неявно объявляет все унаследованные, примитивные операции от GenericVector в Vectors,

use Vectors дает вам прямой видимость тех идентификаторов, которые объявлены в Vectorsв том числе те, которые объявлены неявно. (Неявные объявления такие вещи, как "+", "-"операторы, когда вы объявляете новый целочисленный тип, и унаследованные операции, когда вы объявляете производный тип.) Но это не дает вам прямой видимости ни для чего другого. Особенно, use не является переходным, потому что use all type Vectors3.Vector не объявляет новые идентификаторы в Vectors,

Вы можете сделать это, объявив переименование идентификаторов для всего, что вы хотите use Vectors пользователь, чтобы увидеть. (Для типов вы должны использовать subtype поскольку в Аде нет переименования типов.) Например, в Vectors:

function Dot_Product (V1, V2 : Vectors3.Vector) return Float
   renames Vectors3.Dot_Product;

(Я просто догадываюсь, что операции в GenericVectors может выглядеть так.) Теперь везде, где написано use Vectors сможет использовать Dot_Product непосредственно. Вы должны будете сделать что-то подобное для каждого идентификатора. Если их много, это, вероятно, не жизнеспособное решение. (Объявление переименования не должно использовать одно и то же имя Dot_Product.)

Хотя может показаться раздражающим, что вы не можете получить такой переходный видимость, альтернатива может оказаться более раздражающей, потому что вы не можете смотреть на Vectors и посмотреть, какие идентификаторы будут видны use Vectors; результатом, вероятно, будут либо неожиданные конфликты имен, либо другие неожиданности.

Другие вопросы по тегам