コンテキストとパッケージ
Mathematica 言語で書かれたパッケージにはパッケージの外部で使うために設けられた各種のシンボルが入っている.
一般規約として,パッケージの読込み時に定義される新規のシンボルはすべて個別のコンテキスト,つまり,そのパッケージに関連付けられたコンテキストに入れられることになっている.パッケージが読み込まれる際は,適切なコンテキストが検索パス$ContextPathの先頭に付け加えられる.
| Out[2]= |  |
シンボル

はパッケージによって設定されたコンテキストに入っている.
| Out[3]= |  |
検索パスにコンテキスト指定があるので,簡略名だけで参照できる.
| Out[4]= |  |
パッケージにあるシンボルには非常に長い参照名を持つものが数多くある.しかし,それらの参照は,ほとんどの場合,簡略名だけで間に合う.パッケージが読み込まれると同時に,パッケージのコンテキストが$ContextPathに付け足されるからである.簡略名を入力すると,パスが自動検索されるため適切なコンテキストが判明する.
それでも問題が起らないとは限らない.2つのパッケージを使い,そのどちらにも同じ簡略名の変数があると競合が起ってしまう.実際にパッケージを読み込ませると,2つ目が読み込まれる際には警告が発せられ,新しいパッケージのシンボルにより先のパッケージのシンボルが隠蔽されてしまうという旨が表示される.
新たにパッケージを読み込ませる.すると,

のコンテキストにあるシンボル

が新しいシンボルで隠蔽されてしまう.
| Out[6]= |  |
競合状態は何もパッケージ間だけで起るものではない.読み込まれたパッケージとユーザが現行セッションで直接入力したものとの間でも起り得る.現行コンテキストで何かシンボルを定義したとすると,読み込むパッケージに同名のシンボルがあると,後者が隠されてしまうことがある.理由は,検索パスのコンテキストが現行コンテキストより優先されるためである.
| Out[7]= |  |
パッケージから読み込ませた
Div関数で現行コンテキストの
Div関数が隠れてしまう.
| Out[9]= |  |
| Out[10]= |  |
シンボルの隠蔽問題が起ったら,まず,Remove[s]を使い必要でなくなったシンボルを除去する.それでも問題が解消しないときは,検索パス$ContextPathや現行コンテキスト$Contextを再編集し,必要なシンボルを含むコンテキストが先に検索されるようにする.
| $Packages | 現行 Mathematica セッションに読み込まれている全パッケージのコンテキストがリスト形式で登録してある |
パッケージのコンテキスト