Рекурсивная видимость символов в пакетах 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
; результатом, вероятно, будут либо неожиданные конфликты имен, либо другие неожиданности.