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: [mg78481] Re: Second argument of BeginPackage, revisited
  • From: Albert <awnl at arcor.net>
  • Date: Tue, 3 Jul 2007 05:18:50 -0400 (EDT)
  • References: <f5td66$36j$1@smc.vnet.net><f5vs13$keg$1@smc.vnet.net> <f62k72$bod$1@smc.vnet.net> <f6ambq$hte$1@smc.vnet.net>

Hi,

> you are correct, BeginPackage["a`",{"b`",..}].. EndPackage[] will put 
> 
> all the additional contexts "b`".. into $ContextPath. Therefore, all 
> 
> variables exported by these contexts will be available.
> 
> On the other hand, BeginPackage["a`"] Needs["b`"];.. Endpackage[] will 
> 
> only put "a`" into $ContextPath, therefore, variables from "b`".. are..

I believe that this is not what andrew was complaining in the first 
place, his example had a final second call to Needs:

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

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

which he (and I) think indeed should give identical results and does 
not. I hesitated to answer because I don't have a "solution" nor a good 
explanation, all I can do is back him up that there is something going 
on that is either a bug or at least a feature that needs explaining. I 
have worked out a "full blown" example of what he refers to that 
everyone can try out I hope will convince everyone that there is indeed 
something at least not obvious going on:

copy the following package code into a file tst.m anywhere where 
mathematica looks for packages:

BeginPackage["tst`","PhysicalConstants`"];
rb=BohrRadius;
EndPackage[];

Then compare the results of the two sessions below:

------ session one: BeginPackage with two arguments --------------------

In[1]:= BeginPackage["tst2`", "tst`"];

In[2]:= rbi = Convert[rb, Inch];

In[3]:= EndPackage[];

In[4]:= rbi

Out[4]= Convert[5.29177*10^-11 Meter, Inch]

In[5]:= Context[Convert]

Out[5]= "tst2`"

------ session two: two explicit calls to needs --------------------

In[1]:= BeginPackage["tst2`"];

In[2]:= Needs["tst`"];

In[3]:= rbi = Convert[rb, Inch];

In[4]:= EndPackage[];

In[5]:= Needs["tst`"];

In[6]:= rbi

Out[6]= 2.08337*10^-9 Inch

In[7]:= Context[Convert]

Out[7]= "Units`"

---------------------------------------------------------------------

whoever believes that the outcome of session one is intended behavior 
needs to convince me.

The only other thing that I can contribute is that this is not a new 
problem, I have seen this at least with versions 4 and 5 and I can 
imagine very well that it has existed before. (if you want to check on 
one of these versions with the above example you need to load both 
"Miscellaneous`PhysicalConstants`" and "Miscellaneous`Units`" in tst`). 
When I just rerun the example in version 4 and 5 I realized that the 
behavior of version 4(.2) was even worse: there the final export of 
"Miscellaneous`PhysicalConstants`" and "Miscellaneous`Units`" did not 
even work with the approach of session 2, but the definition of rbi is 
at least done correctly.

And of course there is a workaround (at least for verions >= 5): Don't 
use the second argument but explicit calls to Needs. But that is just 
saying that the second argument to BeginPackage does not work as it 
should :-)

albert


  • Prev by Date: Re: How to view source code of functions in Mathematica?
  • Next by Date: Re: Re: managing version 6 in a locked-down environment
  • Previous by thread: Re: Second argument of BeginPackage, revisited
  • Next by thread: Re: Second argument of BeginPackage, revisited