Webel IT Australia promotes the amazing Mathematica tool and the powerful Wolfram Language and offers professional Mathematica services for computational computing and data analysis. Our Mathematica
tips, issue tracking, and wishlist is offered here most constructively to help improve the tool and language and support the Mathematica user community.
DISCLAIMER: Wolfram Research does not officially endorse analysis by Webel IT Australia.
If a Package TestC has a usage (Needs) declaration for Package TestB (only), and Package TestB has a usage declaration for TestA, the Package TestC will NOT automatically (transitively) see public expressions in Package TestA.
There may be good reasons for this in the Wolfram Language, but it's slightly annoying, as it makes managing Package dependencies harder (compare with the Eclipse IDE transitive Plugin system).
Example: We want to reuse functions from TestA:
BeginPackage["TestA`"]
fInA::usage = "finA[x]";
Begin["`Private`"]
fInA[x_] := x^2;
End[]
EndPackage[]
Package TestB declares a usage (Needs):
BeginPackage["TestB`", { "TestA`"}]
fInB::usage = "finB[x] Relies on A using direct package usage";
Begin["`Private`"]
fInB[x_] := 2 fInA[x];
End[]
EndPackage[]
Package TestC "tries" to get at TestA via TestB:
BeginPackage["TestC`", { "TestB`"}]
fInCvsB::usage = "fInCvsB[x] Relies on direct package usage.";
fInCvsA::usage = "fInCvsA[x] Relies on TestB to load TestA: FAILS!";
fInCvsAdir::usage = "fInCvsAdir[x] Uses explicit namespace-qualified access ";
Begin["`Private`"]
fInCvsB[x_] := 4 fInB[x];
fInCvsA[x_] := 4 fInA[x];
fInCvsAdir[x_] := 4 TestA`fInA[x];
End[]
EndPackage[]
TestB from TestC works fine:
fInCvsB[2]
32
But accessing TestA indirectly FAILS:
fInCvsA[2]
4 TestC`Private`fInA[2]
One can, however, access the public functions of TestA from TestC using namespace qualifiers:
fInCvsAdir[2]
16
To access without such qualifiers you need an explicit usage of TestA in TestC:
BeginPackage["TestC`", { "TestA`", "TestB`"}]
The Systems Modeling Language v1 (SysML®) image represents the Package dependencies (Needs) as SysML Usages and the function Dependencies.
