MathGroup Archive 2007

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

Search the Archive

Re: Second argument of BeginPackage, revisited

  • To: mathgroup at smc.vnet.net
  • Subject: [mg78356] Re: Second argument of BeginPackage, revisited
  • From: Andrew Moylan <andrew.j.moylan at gmail.com>
  • Date: Fri, 29 Jun 2007 05:41:03 -0400 (EDT)
  • References: <f5td66$36j$1@smc.vnet.net><f5vs13$keg$1@smc.vnet.net>

On Jun 28, 6:37 pm, dh <d... at metrohm.ch> wrote:
> 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?

Daniel, you have misunderstood the question in my post.

Here is the crucial irregularity to which I refer:

BeginPackage["a`", {"b`"}]
(* code block 1 *)
EndPackage[]

BeginPackage["a`"]
Needs["b`"]
(* code block 2 *)
EndPackage[]
Needs["b`"]

The above two alternatives are not identical, because (strangely, in
my opinion) code in code block 1 cannot refer to symbols defined in
any packages declared in the second argument of the BeginPackage
statement for b` (in b.m); whereas code in code block 2 *can* refer to
such symbols.

Here is a different way to understand the irregularity:

Suppose this code works correctly:

Needs["b`"]
(* code block 3 *)

Then, will this code generally also work correctly?

BeginPackage["whatever`", {"b`"}]
(* code block 3 *)

The answer is no, because of the way BeginPackage apparently modifies
the value of $ContextPath after calling Needs[] on its second argument.



  • Prev by Date: Re: [Mathematica 6] Integrate strange result
  • Next by Date: Re: Re: bug in Integrate
  • Previous by thread: Re: Second argument of BeginPackage, revisited
  • Next by thread: RE: Re: Second argument of BeginPackage, revisited