コンテキストとパッケージ

Mathematica 言語で書かれたパッケージにはパッケージの外部で使うために設けられた各種のシンボルが入っている.

一般規約として,パッケージの読込み時に定義される新規のシンボルはすべて個別のコンテキスト,つまり,そのパッケージに関連付けられたコンテキストに入れられることになっている.パッケージが読み込まれる際は,適切なコンテキストが検索パス$ContextPathの先頭に付け加えられる.

素数証明のためのパッケージを読み込ませる.
In[1]:=
Click for copyable input
検索パス$ContextPathの先頭にこのパッケージのコンテキストが付け足される.
In[2]:=
Click for copyable input
Out[2]=
シンボルはパッケージによって設定されたコンテキストに入っている.
In[3]:=
Click for copyable input
Out[3]=
検索パスにコンテキスト指定があるので,簡略名だけで参照できる.
In[4]:=
Click for copyable input
Out[4]=

パッケージにあるシンボルには非常に長い参照名を持つものが数多くある.しかし,それらの参照は,ほとんどの場合,簡略名だけで間に合う.パッケージが読み込まれると同時に,パッケージのコンテキストが$ContextPathに付け足されるからである.簡略名を入力すると,パスが自動検索されるため適切なコンテキストが判明する.

それでも問題が起らないとは限らない.2つのパッケージを使い,そのどちらにも同じ簡略名の変数があると競合が起ってしまう.実際にパッケージを読み込ませると,2つ目が読み込まれる際には警告が発せられ,新しいパッケージのシンボルにより先のパッケージのシンボルが隠蔽されてしまうという旨が表示される.

新たにパッケージを読み込ませる.すると,のコンテキストにあるシンボルが新しいシンボルで隠蔽されてしまう.
それでも,正式名を使えば参照することができる.
In[6]:=
Click for copyable input
Out[6]=

競合状態は何もパッケージ間だけで起るものではない.読み込まれたパッケージとユーザが現行セッションで直接入力したものとの間でも起り得る.現行コンテキストで何かシンボルを定義したとすると,読み込むパッケージに同名のシンボルがあると,後者が隠されてしまうことがある.理由は,検索パスのコンテキストが現行コンテキストより優先されるためである.

現行コンテキストに関数を1つ定義する.
In[7]:=
Click for copyable input
Out[7]=
パッケージから読み込ませたDiv関数で現行コンテキストのDiv関数が隠れてしまう.
直交座標系を選択しベクトル解析の準備をする.
In[9]:=
Click for copyable input
Out[9]=
パッケージのDivが使われる.
In[10]:=
Click for copyable input
Out[10]=

シンボルの隠蔽問題が起ったら,まず,Remove[s]を使い必要でなくなったシンボルを除去する.それでも問題が解消しないときは,検索パス$ContextPathや現行コンテキスト$Contextを再編集し,必要なシンボルを含むコンテキストが先に検索されるようにする.

$Packages現行 Mathematica セッションに読み込まれている全パッケージのコンテキストがリスト形式で登録してある

パッケージのコンテキスト

New to Mathematica? Find your learning path »
Have a question? Ask support »