MathGroup Archive 2006

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

Search the Archive

Re: Context

  • To: mathgroup at smc.vnet.net
  • Subject: [mg70980] Re: Context
  • From: jljelinek at comcast.net
  • Date: Fri, 3 Nov 2006 01:39:32 -0500 (EST)
  • References: <eicnon$g4g$1@smc.vnet.net>

Daniel,

when you type in a symbol, Mathematica first checks for its occurence
through all the contexts on its $ContextPath, proceeding left to right.
Assuming that you started a fresh Mathematica session, you should see
{Global`, System`} after you execute $ContextPath.

Now try the following program, which will print the current context and
context path.

t = "outside";
Print["before ", $Context, "  ", $ContextPath];
Begin["aa`"];
Print["inside ", $Context, "  ", $ContextPath];
taa = "inside-aa`";
Print[t, "       taa= ", taa];
End[];
Print["after ", $Context, "  ", $ContextPath];

You will see that while the current context changes as a result of
having executed Begin, the context path does not. It means that if you
introduce a new variable t in your program, Mathematica will first try
to locate it in Global`, then in System` and having failed to find it
in either, it will create a new symbol t. The new symbol will not be in
the current context, though, but in the leftmost context in
$ContextPath, which happens to be Global` in your case.

If you want to place a symbol in a new context, then you have to use
BeginPackage. Execute the following program:

Print["before ", t, "  ", taa];
Print["before ", $Context, "  ", $ContextPath];
BeginPackage["bb`"];
Print["in ", $Context, "  ", $ContextPath];
tbb = "inside-bb";
Print[t, "       taa= ", taa, "       tbb= ", tbb];
EndPackage[];
Print["after ", $Context, "  ", $ContextPath];
Print["after ", t, "  ", taa, "  ", tbb];

Note that once the execution thread enters the new context bb`, the
Global` context (and all other contexts if there were more of them)
disappear from the context path and are replaced by bb`. (The System`
context is always present.) When the symbol tbb appears, Mathematica
starts looking for it left to right among the contexts on its current
context path. Since it is not in bb` and it is not a system symbol
either, Mathematica introduces it as a new symbol in the leftmost
context, i.e., bb`, on the current context path. The program exits the
bb` context on executing EndPackage and as you see, the new context bb`
is now prepended to the context path. You can check where the three
symbols t, taa and tbb are located by executing Context[t],
Context[taa], Context[tbb].

Even though tbb exists only in the bb` context, you can access it
simply by typing tbb, since it is exported by having its context placed
on the context path.

This mechanism is crucial for the Mathematica packages.

Jan

dh wrote:
> Hello,
>
> consider:
>
> fun[x_]:=( Begin[x];
>
>        Print[t];
>
>        End[];
>
>        );
>
> according to the manual one would think that the variable t in context x
>
> is printed. However, this is wrong! What is printed is Global`t.
>
> Therefore, the context to which a symbol belongs is determined during
>
> parsing and NOT execution.
>
> Can anybode give more insight and strict rules for this quirck?
> 
> Daniel


  • Prev by Date: Re: Clarification re. Curiosity concerning transformation rules for List
  • Next by Date: Re: Conceptual Issues with NonlinearRegress[]
  • Previous by thread: Re: RE: Context
  • Next by thread: SchematicSolver and MathModelica