MathGroup Archive 2006

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Nested Packages and scoping

  • To: mathgroup at smc.vnet.net
  • Subject: [mg63829] Re: Nested Packages and scoping
  • From: dh <dh at metrohm.ch>
  • Date: Tue, 17 Jan 2006 04:33:24 -0500 (EST)
  • References: <dqack8$1b9$1@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

Hi Detlef,
your problem is that you must understand what BeginPackage does. After 
BeginPackages only System and your package is on the context-path (read 
the manual. E.g. If you say:
g::usage = "g is 5";
then g is created in the Global context.
If subsequently you say:
BeginPackage["X`"];
   g := 5;
then you create a new G in the X-context.

Here is an example with 3 netsed contexts:

BeginPackage["A`"];
f1::usage = "f1 ...";
Begin["`Private`"];
f1 := Print["in package A"];
End[];
EndPackage[];

BeginPackage["B`", "A`"];
f2::usage = "f2 ...";
Begin["`Private`"];
f2 := (Print["Calling A from B:"]; f1);
End[];
EndPackage[];

BeginPackage["C`", "B`"];
f3::usage = "f3 ...";
Begin["`Private`"];
f3 := (Print["Calling C from B:"]; f2);
End[];
EndPackage[];


if you now say:
f3
you get:

Calling C from B:

Calling A from B:

in package A

have fun, Daniel

Detlef Müller wrote:
> Hello,
> 
> I wrote two Packages, the one, say "A" containing Basics,
> and one, say "B" containing higher Functions, using those
> of "A".
> 
> Now the User should type
> 
>   Needs["B`"]
> 
> and have all the Functions of A and B.
> I figured out, that for this following looks
> awkward, but seems the only way:
> 
> ---------------------
> 
> File A.m
> 
> BeginPackage["A`"];
> f::usage="f is 7";
> Begin["`Private`"];
> f:=7;
> End[]
> EndPackage[]
> 
> ---------------------
> 
> File B3.m:
> 
> Needs["A`"];  (* without this, f not known in calling context *)
> 
> BeginPackage["B3`"];
> 
> Needs["A`"]; (* without this, f not known in this context *)
> Print[f];
> EndPackage[]
> 
> ----------------------
> 
> But then I had to nest it one Step further. And now a
> problem occures:
> 
> If I have a package X.m with
> 
> g::usage = "g is 5";
> BeginPackage["X`"];
> g := 5;
> EndPackage[]
> 
> And A.m is switched to
> 
> -------------------------
> 
> Needs["X`"];
> BeginPackage["A`"];
> Needs["X`"];
> f::usage = "f is 7";
> Begin["`Private`"];
> f := 7;
> End[]
> EndPackage[]
> 
> -------------------------
> 
> The following happens:
> 
> Needs["B3`"]
> 
> (g::"shdw"\),Symbol g appears in multiple contexts (X`,Global`)
> definitions in context (X`) may shadow or be shadowed by other \
> definitions. mehr...
> 
> {f, g}
> {7, g}
> 
> Is there a Way to achieve, that the Symbols of all used
> Packages are inherited?
> 
> (Version is Mathematica 5.1)
> 
> Greetings,
>    Detlef
> 


  • Prev by Date: Re: NDSolve useless?
  • Next by Date: question about matrix
  • Previous by thread: Re: Nested Packages and scoping
  • Next by thread: FindInstance