Re: Second argument of BeginPackage, revisited
- To: mathgroup at smc.vnet.net
- Subject: [mg78321] Re: Second argument of BeginPackage, revisited
- From: dh <dh at metrohm.ch>
- Date: Thu, 28 Jun 2007 04:27:19 -0400 (EDT)
- References: <f5td66$36j$1@smc.vnet.net>
Hi Andrew,
you misunderstood the Package concept. BeginPackage["a`", {"b`"}] will
place b in the $ContextPath so that its content can be found, but it
does not put b in Context[], so that new variables are not created in b.
The following may help. Start a new session and enter:
BeginPackage["b`",{"PhysicalConstants`"}]
Print[SpeedOfLight];
Print[Context[]];
Print[$ContextPath];
EndPackage[]
hope this helps, Daniel
Andrew Moylan wrote:
> Unfortunately (in my opinion), BeginPackage["a`", {"b`"}] does not *quite*
> call Needs[] on its second argument(s).
>
> Suppose b.m looks like this:
>
> BeginPackage["b`", {"PhysicalConstants`"}]
> (* some code *)
> EndPackage[]
>
> Then calling Needs["b`"] in a new kernel results in "PhysicalConstants`"
> being on the list of contexts, so that e.g. SpeedOfLight works as expected.
>
> But calling BeginPackage["a`", {"b`"}] instead does *not* put
> PhysicalConstants on the list of contexts during the definition of the
> package, so that e.g. SpeedOfLight results in the creation of a new, useless
> symbol called a`SpeedOfLight.
>
> Finally, for maximum confusion (in my opinion), once EndPackage[] is called
> to finish loading the "a`" package, "PhysicalConstants`" *is* placed on the
> list of contexts, causing shadowing between a`SpeedOfLight and
> PhysicalConstants`SpeedOfLight.
>
> Effectively, BeginPackage appears to
> 1. Call Needs[] on its second arguments, then
> 2. Temporarily remove from the context path any extra contexts those
> packages added to the context path, then finally
> 3. Put all those temporarily removed packages back onto the context path
> once EndPackage[] is called.
>
> Can anyone help me understand why this behaviour is useful?
>
>