MathGroup Archive 2007

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

Search the Archive

RE: Re: Second argument of BeginPackage, revisited

  • To: mathgroup at smc.vnet.net
  • Subject: [mg78396] RE: [mg78356] Re: Second argument of BeginPackage, revisited
  • From: José Luis Gómez <jose.luis.gomez at itesm.mx>
  • Date: Sat, 30 Jun 2007 06:07:14 -0400 (EDT)
  • References: <f5td66$36j$1@smc.vnet.net><f5vs13$keg$1@smc.vnet.net> <200706290941.FAA11989@smc.vnet.net>

Dear Andrew

As far as I know, you are right when you say that:

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

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

do NOT do "exactly" the same (the second one is called "hidden import"). 
I have written several Mathematica packages taking advantage of the
difference between this two (for a very simple example please see the sample
package code in this link:
http://homepage.cem.itesm.mx/lgomez/createMathematicaAddOn.htm )
maybe it is not what everybody expects, maybe it is not as clearly
documented as everybody would want, and sooner or later anyone forgets the
important back-quote "`" at the end, but it is the behavior of Mathematica
since version 2.0, and you can actually take advantage of the two options.
For me, a great help in understanding Mathematica's packages was this book:
(Do not worry that it is not version 6.0, the package thing is practically
the same since version 2.0):

Programming in Mathematica by Roman Maeder (can find it in Amazon)
http://www.amazon.com/Programming-Mathematica-3rd-Roman-Maeder/dp/020185449X
/ref=sr_1_5/104-1499246-1083118?ie=UTF8&s=books&qid=1183142246&sr=8-5 

I am sure that the more you know it, the more you love it (Mathematica).
That happened to me.

Regards!

Jose

-----Mensaje original-----
De: Andrew Moylan [mailto:andrew.j.moylan at gmail.com] 
Enviado el: Viernes, 29 de Junio de 2007 04:41 a.m.
Para: mathgroup at smc.vnet.net
Asunto: [mg78356] Re: Second argument of BeginPackage, revisited

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: Suggestions for Maintaining "Object" State?
  • Previous by thread: Re: Second argument of BeginPackage, revisited
  • Next by thread: System of differential-algebraic equations