Ada包中符号的递归可见性

时间:2014-05-17 21:09:26

标签: packages ada ada2012

假设我有一个通用的矢量库。为了更容易使用,我想实例化矢量库的各种常见形式,并使它们在单个包中可见。

我正在尝试这个:

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;并最终获得直接可用的Vector3Vector4类型的工作。

自然,上面的代码不起作用。看起来use all type语句将附加到指定类型的定义导入到包规范中,但这些定义不会导出到Vectors的用户。我必须改为with Vectors; use Vectors; use all type Vectors.Vectors3;。这有点太糟糕了。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

您可以简单地制作Vector3Vector4个新类型,而不仅仅是子类型。这将隐含地声明GenericVectorVectors的所有继承的原始操作。

答案 1 :(得分:1)

use Vectors可让您直接查看Vectors中声明的标识符,包括隐式声明的标识符。 (隐式声明是"+""-"之类的东西,声明新整数类型时的运算符,以及声明派生类型时的继承操作。)但是它不会让你直接看到其他任何东西。特别是,use 传递,因为use all type Vectors3.Vector未在Vectors中声明任何新标识符。

您可以通过声明为use Vectors用户看到的所有内容重命名标识符来实现此目的。 (对于类型,您必须使用subtype,因为在Ada中没有类型重命名。)例如。在Vectors

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

(我只是猜测GenericVectors中的操作可能是什么样子。)现在,任何说use Vectors的地方都可以直接使用Dot_Product。但是,您必须为每个标识符执行类似的操作。如果有很多,这可能不是一个可行的解决方案。 (重命名声明不必使用相同的名称Dot_Product。)

虽然看起来很烦人,你无法获得这种传递性的可见性,但替代方案可能会变得更加烦人,因为你无法查看Vectors并查看将制作哪些标识符use Vectors可见;结果可能是意外的名称冲突或其他意外。