Question about how Contex resolving works in Mathematica
- To: mathgroup at smc.vnet.net
- Subject: [mg15177] Question about how Contex resolving works in Mathematica
- From: ozan at matematik.su.se (Ozan Oektem)
- Date: Fri, 18 Dec 1998 23:20:21 -0500
- Organization: Department of Mathematics, Stockholm University
- Sender: owner-wri-mathgroup at wolfram.com
Hi,
I have real big problems understanding how Mathematica handels
Contexts. Let me give an example to illustrate the things I can't
understand.
Say that we have two packages "A.m" and "B.m" (source code listed at the
end) in a directory called "test" (that is searched by Mathematica).
They define the procedures "procA" and "procB" which are identical.
The procedures do the following:
1) Print "$Packages", "$Context" and "$ContextPath". 2) Print the
available options for a external procedure in a nonstandard
external package. I chose "MeanTest" in
"Statistics`HypothesisTests`". 3) Filter (by using
"Utilities`FilterOptions`") the options for "MeanTest"
and print the filtered options.
Thus, both packages use the external packages
"Utilities`FilterOptions`"
"Statistics`HypothesisTests`"
The only difference between the packages are that "A.m" makes a hidden
import of "Statistics`HypothesisTests`" with the command "Needs" after
"Begin[`Private`]", whereas "B.m" makes a usual import of
"Statistics`HypothesisTests`" (both packages make a hidden import of
"Utilities`FilterOptions`").
I have included four different runs (between each run I restart the
kernel) and for each run I have a set of questions.
Loading A only: Here we see that FilterOptions can not filter out the
options for "MeanTest". Of course this occurs since the
"Options[MeanTest]"
command issued inside "A.m" does not return the short names of the
options,
instead it returns the full names. Why? Even though "A.m" makes a
hidden
import of "Statistics`HypothesisTests`", the command
"Options[MeanTest]" is
issued inside "A.m". Is there a simple way to filter out the options
for
"MeanTest" by using "FilterOptions"?
Loading B only: Things works as supposed, i.e. "Options[MeanTest]"
returns
the short names for the options. Therefore FilterOptions also works.
Loading A first then B: Now things really become strange. First of all,
why
does loading "A.m" at all affect print statements made inside "B.m"?
"KnownVariance" is probably an option defined in
"Statistics`Common`PopulationsCommon`"
which is loaded unhidden by "Statistics`HypothesisTests`". It seems
that the
fact that "A.m" loads "Statistics`HypothesisTests`" in a hidden way
(which
implies that "A.m" also loads "Statistics`Common`PopulationsCommon`"
in a
hidden way) prevents "B.m" from loading
"Statistics`Common`PopulationsCommon`"
unhidden. This would explain the falior for filtering out the
"KnownVariance"-option in "B.m". Thus, one must explicitly load
"Statistics`Common`PopulationsCommon`" in "B.m" for "B.m" to behave as
when it
was loaded alone. This is strange however, since inside
"Begin["`Private`"]",
the package "B.m" should only know about what has been loaded by
itself. Is
there a better way of ensuring that "A.m" does not affect "B.m"?
Loading B first then A: Again the same explanation as in the case above
would apply. This time the loading of "B.m" first causes "A.m" to
behave
differently.
The disturbing thing is that two packages that has nothing to do with
each other (neither calls the other, nor do they define the same
symbols) except that they load the same underlying package, still
affects the internal behavior when loaded at the same time. I really
want to make sure that this does not happend. Is there a simple way to
guarantee that?
Loading A only:
---------------
In[1]:=<<test`A`;
In[2]:=procA[FullReport->False,KnownVariance->True]
Loaded Packages
{Utilities`FilterOptions`,
Statistics`Common`PopulationsCommon`,
Statistics`Common`DistributionsCommon`,
Statistics`DescriptiveStatistics`,
Statistics`NormalDistribution`,
Statistics`HypothesisTests`,
test`A`,Global`,System`}
The current context path is
{test`A`,Graphics`Animation`,Global`,System`}
Availabel optionas for MeanTest and default values:
{Statistics`Common`PopulationsCommon`KnownStandardDeviation->None,
Statistics`HypothesisTests`FullReport->False,
Statistics`Common`PopulationsCommon`KnownVariance->None,
Statistics`HypothesisTests`SignificanceLevel->None,
Statistics`HypothesisTests`TwoSided->False}
Options for MeanTest by FilterOptions are
{}
Loading B only:
---------------
In[1]:=<<test`B`;
In[2]:=procA[FullReport->False,KnownVariance->True]
Loaded Packages
{Utilities`FilterOptions`,
Statistics`Common`PopulationsCommon`,
Statistics`Common`DistributionsCommon`,
Statistics`DescriptiveStatistics`,
Statistics`NormalDistribution`,
Statistics`HypothesisTests`,
test`B`,Global`,System`}
The current context path is
{test`B`,Statistics`HypothesisTests`,
Statistics`Common`PopulationsCommon`,
Statistics`NormalDistribution`,
Statistics`Common`DistributionsCommon`,
Statistics`DescriptiveStatistics`,
Graphics`Animation`,Global`,
System`}
Availabel optionas for MeanTest and default values:
{KnownStandardDeviation->None,
FullReport->False,
KnownVariance->None,
SignificanceLevel->None,
TwoSided->False}
Options for MeanTest by FilterOptions are
{FullReport->False,KnownVariance->True}
Loading A first then B:
-----------------------
In[1]:=<<test`A`;
<<test`B`;
In[2]:=procB[FullReport->False,KnownVariance->True]
Loaded Packages
{test`B`,Utilities`FilterOptions`,
Statistics`Common`PopulationsCommon`,
Statistics`Common`DistributionsCommon`,
Statistics`DescriptiveStatistics`,
Statistics`NormalDistribution`,
Statistics`HypothesisTests`,
test`A`,Global`,System`}
The current context path is
{test`B`,Statistics`HypothesisTests`,
test`A`,Graphics`Animation`,Global`,System`}
Availabel optionas for MeanTest and default values:
{Statistics`Common`PopulationsCommon`KnownStandardDeviation->None,
FullReport->False,
Statistics`Common`PopulationsCommon`KnownVariance->None,
SignificanceLevel->None,
TwoSided->False}
Options for MeanTest by FilterOptions are
{FullReport->False}
In[3]:=procA[FullReport->False,KnownVariance->True]
Loaded Packages
{test`B`,Utilities`FilterOptions`,
Statistics`Common`PopulationsCommon`,
Statistics`Common`DistributionsCommon`,
Statistics`DescriptiveStatistics`,
Statistics`NormalDistribution`,
Statistics`HypothesisTests`,
test`A`,Global`,System`}
The current context path is
{test`B`,Statistics`HypothesisTests`,
test`A`,Graphics`Animation`,Global`,System`}
Availabel optionas for MeanTest and default values:
{Statistics`Common`PopulationsCommon`KnownStandardDeviation->None,
FullReport->False,
Statistics`Common`PopulationsCommon`KnownVariance->None,
SignificanceLevel->None,
TwoSided->False}
Options for MeanTest by FilterOptions are
{FullReport->False}
Loading B first then A:
-----------------------
In[1]:=<<test`B`;
<<test`A`;
In[2]:=procB[FullReport->False,KnownVariance->True]
Loaded Packages
{test`A`,Utilities`FilterOptions`,
Statistics`Common`PopulationsCommon`,
Statistics`Common`DistributionsCommon`,
Statistics`DescriptiveStatistics`,
Statistics`NormalDistribution`,
Statistics`HypothesisTests`,
test`B`,Global`,System`}
The current context path is
{test`A`,test`B`,Statistics`HypothesisTests`,
Statistics`Common`PopulationsCommon`,Statistics`NormalDistribution`,
Statistics`Common`DistributionsCommon`,
Statistics`DescriptiveStatistics`,
Graphics`Animation`,Global`,System`}
Availabel optionas for MeanTest and default values:
{KnownStandardDeviation->None,
FullReport->False,
KnownVariance->None,
SignificanceLevel->None,
TwoSided->False}
Options for MeanTest by FilterOptions are
{FullReport->False,KnownVariance->True}
In[3]:=procA[FullReport->False,KnownVariance->True]
Loaded Packages
{test`A`,Utilities`FilterOptions`,
Statistics`Common`PopulationsCommon`,
Statistics`Common`DistributionsCommon`,
Statistics`DescriptiveStatistics`,
Statistics`NormalDistribution`,
Statistics`HypothesisTests`,
test`B`,Global`,System`}
The current context path is
{test`A`,test`B`,Statistics`HypothesisTests`,
Statistics`Common`PopulationsCommon`,Statistics`NormalDistribution`,
Statistics`Common`DistributionsCommon`,
Statistics`DescriptiveStatistics`,
Graphics`Animation`,Global`,System`}
Availabel optionas for MeanTest and default values:
{KnownStandardDeviation->None,
FullReport->False,
KnownVariance->None,
SignificanceLevel->None,
TwoSided->False}
Options for MeanTest by FilterOptions are
{FullReport->False,KnownVariance->True}
Source code for A.m
-------------------
BeginPackage["test`A`"]
procA::usage="..."
Begin["`Private`"]
Needs["Statistics`HypothesisTests`"] Needs["Utilities`FilterOptions`"]
procA[opts___]:=
Module[{optsForMeanTest},
optsForMeanTest=FilterOptions[MeanTest,opts];
Print["Loaded Packages "];
Print[$Packages];
Print["The current context path is "];
Print[$ContextPath];
Print["Availabel options for MeanTest and default values:"];
Print[Options[MeanTest]];
Print["Options for MeanTest by FilterOptions are "];
Print[{optsForMeanTest}];
]
End[]
EndPackage[]
Source code for B.m
-------------------
BeginPackage["test`B`","Statistics`HypothesisTests`"]
procB::usage="..."
Begin["`Private`"]
Needs["Utilities`FilterOptions`"]
procB[opts___]:=
Module[{optsForMeanTest},
optsForMeanTest=FilterOptions[MeanTest,opts];
Print["Loaded Packages "];
Print[$Packages];
Print["The current context path is "];
Print[$ContextPath];
Print["Availabel options for MeanTest and default values:"];
Print[Options[MeanTest]];
Print["Options for MeanTest by FilterOptions are "];
Print[{optsForMeanTest}];
]
End[]
EndPackage[]
--
Ozan Oektem Phone : +46-8-16 49 15 Department of
Mathematics Fax : +46-8-612 67 17 Stockholm University
E-mail: ozan at matematik.su.se 106 91 Stockholm, Sweden