# Contexts

It is always a good idea to give variables and functions names that are as explicit as possible. Sometimes, however, such names may get inconveniently long.

In *Mathematica*, you can use the notion of "contexts" to organize the names of symbols. Contexts are particularly important in *Mathematica* packages that introduce symbols whose names must not conflict with those of any other symbols. If you write *Mathematica* packages, or make sophisticated use of packages that others have written, then you will need to know about contexts.

The basic idea is that the *full name* of any symbol is broken into two parts: a *context* and a *short name*. The full name is written as , where the is the backquote or grave accent character (ASCII decimal code 96), called a "context mark" in *Mathematica*.

In[1]:= |

Out[1]= |

In[2]:= |

Out[2]= |

In[3]:= |

Out[3]= |

In[4]:= |

Out[4]= |

It is typical to have all the symbols that relate to a particular topic in a particular context. Thus, for example, symbols that represent physical units might have a context . Such symbols might have full names like or .

Although you can always refer to a symbol by its full name, it is often convenient to use a shorter name.

At any given point in a *Mathematica* session, there is always a *current* *context* $Context. You can refer to symbols that are in this context simply by giving their short names, unless the symbol is shadowed by the symbol with the same short name on the $ContextPath. If a symbol with the given short name exists on the context path, it will be used instead of the symbol in the current context.

In[5]:= |

Out[5]= |

In[6]:= |

Out[6]= |

Contexts in *Mathematica* work somewhat like file directories in many operating systems. You can always specify a particular file by giving its complete name, including its directory. But at any given point, there is usually a current working directory, analogous to the current *Mathematica* context. Files that are in this directory can then be specified just by giving their short names.

Like directories in many operating systems, contexts in *Mathematica* can be hierarchical. Thus, for example, the full name of a symbol can involve a sequence of context names, as in .

context `name orc_{1}`c_{2} ... `name | a symbol in an explicitly specified context |

`name | a symbol in the current context |

`context`name or`c_{1}`c_{2}` ... `name | a symbol in a specific context relative to the current context |

name | a symbol in the current context, or found on the context search path |

Specifying symbols in various contexts.

In[7]:= |

Out[7]= |

When you start a *Mathematica* session, the default current context is . Symbols that you introduce will usually be in this context. However, built-in symbols such as Pi are in the context .

In order to let you easily access not only symbols in the context , but also in contexts such as , *Mathematica* supports the notion of a *context search path*. At any point in a *Mathematica* session, there is both a current context $Context, and also a current context search path $ContextPath. The idea of the search path is to allow you to type in the short name of a symbol, then have *Mathematica* search in a sequence of contexts to find a symbol with that short name.

The context search path for symbols in *Mathematica* is analogous to the "search path" for program files provided in operating systems. Since $Context is searched after $ContextPath, you can think of it as having "." appended to the file search path.

In[8]:= |

Out[8]= |

In[9]:= |

Out[9]= |

Context[s] | the context of a symbol |

$Context | the current context in a Mathematica session |

$ContextPath | the current context search path |

Contexts[] | a list of all contexts |

Finding contexts and context search paths.

When you use contexts in *Mathematica*, there is no reason that two symbols that are in different contexts cannot have the same short name. Thus, for example, you can have symbols with the short name both in the context and in the context .

There is, however, then the question of which symbol you actually get when you type in only the short name . The answer to this question is determined by which of the contexts comes first in the sequence of contexts listed in the context search path.

In[10]:= |

Out[10]= |

*Mathematica*adds new contexts to the beginning of $ContextPath.

In[11]:= |

Out[11]= |

In[12]:= |

Out[12]= |

In general, when you type in a short name for a symbol, *Mathematica* assumes that you want the symbol with that name whose context appears earliest in the context search path. As a result, symbols with the same short name whose contexts appear later in the context search path or symbols with the same short name in the current context are effectively "shadowed". To refer to these symbols, you need to use their full names.

*Mathematica* issues a message when you introduce new symbols that "shadow" existing symbols with your current choice for $ContextPath. In addition, in the notebook front end *Mathematica* warns you of shadowed symbols by coloring them red.

*Mathematica*warns you that the new symbol shadows existing symbols with short name .

In[13]:= |

Out[13]= |

In[14]:= |

Out[14]= |

If you once introduce a symbol that shadows existing symbols, it will continue to do so until you either rearrange $ContextPath, or explicitly remove the symbol. You should realize that it is not sufficient to clear the *value* of the symbol; you need to actually remove the symbol completely from *Mathematica*. You can do this using the function Remove[s].

Clearing and removing symbols in *Mathematica*.

In[15]:= |

In[16]:= |

Out[16]= |

When *Mathematica* prints out the name of a symbol, it has to choose whether to give the full name, or just the short name. What it does is to give whatever version of the name you would have to type in to get the particular symbol, given your current settings for $Context and $ContextPath.

In[17]:= |

Out[17]= |

If you type in a short name for which there is no symbol either in the current context, or in any context on the context search path, then *Mathematica* has to *create* a new symbol with this name. It always puts new symbols of this kind in the current context, as specified by $Context.

In[18]:= |

Out[18]= |

In[19]:= |

Out[19]= |