コンテキスト

変数名と関数名は,できるだけ具体的な名前にした方がよい.しかし,あまり長いのも考えものである.

Mathematica では,「コンテキスト」と呼ばれる考え方が使われシンボルの名前を構成することができるようになっている.コンテキストは,Mathematica のパッケージを使うときに特に重要で,あるパッケージで導入されたシンボルの名前が他のシンボルの名前と競合しないようにするために使われる.ユーザ自身でパッケージを記述する場合や,市販パッケージの中身を変更するような場合には,コンテキストについて詳しい知識を持つ必要がある.

対象になるオブジェクトが何であれ,その正式名称は必ず2つの部分からなる.すなわち,完全名はコンテキスト名と簡略名(いわゆる名前)からなり,「」の書式で記述される.Mathematica において,記号は(ASCII文字コード番号は10進数の96)コンテキストマークと呼ばれる.

一例として,コンテキストがで簡略名がからなるシンボルの正式名を作ってみる.
In[1]:=
Click for copyable input
Out[1]=
今作ったシンボルを使ってみる.他のシンボルと同様に使うことができる.
In[2]:=
Click for copyable input
Out[2]=
このシンボルには,どんな値でも定義することができる.
In[3]:=
Click for copyable input
Out[3]=
は全く別のものとして扱われる.
In[4]:=
Click for copyable input
Out[4]=

定義したいシンボルの種類に依存してコンテキストを使い分けるとよい.例えば,物理単位を表したシンボルには,特別なコンテキストを使ったりすることができる.そうすると,単位記号の完全名は(ジュール)とか(モル)とかになる.

完全名を使わなくても,普通は,短くて便利な簡略名だけで間に合う.

現行セッションの任意位置において,現行のコンテキスト$Contextは必ず1つだけある.シンボルが$ContextPath上の同じ短縮名を持つシンボルで隠されていない限り,そのコンテキストにあるシンボルはその簡略名を使うだけで参照することができる.

Mathematica セッションにおけるデフォルトのコンテキストは(大域)である.
In[5]:=
Click for copyable input
Out[5]=
$ContextPath上に名前がであるシンボルが存在しないので,現行のコンテキストのシンボルは簡略名だけで参照することができる.
In[6]:=
Click for copyable input
Out[6]=

コンテキストは,いくつかの面で,多くのオペレーティングシステムで使われているファイルのディレクトリに似ている.例えば,ファイルを指定するには,ファイル名とディレクトリ名を一緒に指定すれば確実にできる.しかし,現行ディレクトリにあるファイルなら,いちいちディレクトリ名を指定する必要はない.

多くのオペレーティングシステムにおけるディレクトリがそうであるように,Mathematica のコンテキストも階層構造を取っている.例えば,シンボルが3つのコンテキストからなる階層位置に置かれている場合,その正式名は, となる.

context `name またはc1`c2 ... `name絶対指定コンテキスト
`name現行コンテキスト
`context`name または`c1`c2` ... `name相対指定コンテキスト
name相対指定コンテキスト

コンテキストの指定法

コンテキストにおいてシンボルを作る.
In[7]:=
Click for copyable input
Out[7]=

Mathematica のセッションが始まる時点では,コンテキストは(大域的)にされる.普通は,このコンテキストにオブジェクトを作成していくことになる.例外として,Pi等の組込み定数は(システム)コンテキストに定義される.

だけでなく,のようなよく使われるコンテキストは特別な操作なしで使うことができると便利である.そこで,コンテキストの検索パスと呼ばれるオブジェクトが提供されているので,それを使うことで自動的なアクセスを可能にすることができる.また,現行コンテキストはパラメータ$Contextに登録される.検索パスは$ContextPathに保持される.コンテキスト名が検索パスにあれば,そのコンテキストにあるオブジェクトを参照するときに特にそのコンテキストを指定する必要はない.簡略名だけで指定できる.

Mathematica のシンボルに対するコンテキスト検索パスは,プログラムファイルを探すためのオペレーティングシステム上の検索パスに相当する.$Context$ContextPathの後に検索されるため,ファイルの検索パスに「.」が加わったものと考えることができる.

コンテキスト検索パスにはシステムコンテキストも含まれている.
In[8]:=
Click for copyable input
Out[8]=
Piのコンテキストはシステム()である.
In[9]:=
Click for copyable input
Out[9]=
Context[s]シンボルのコンテキスト
$Context現行セッションにおける現行コンテキスト
$ContextPath現行コンテキスト検索パス
Contexts[]すべてのコンテキストのリスト

コンテキスト関連の機能

違うコンテキストならば,簡略名は同じであっても構わない.例えば,物理単位コンテキストと生物コンテキストと呼ばれるコンテキストを作ったとする.すると,そのどちらのコンテキストにも,の同一名でシンボルを作成することができる.

それでは,簡略名だけを指定すると,どちらの変数が実際に選択されるだろうか.検索パスのリストでより先に指定してあるコンテキストが優先される.

簡略名をとするコンテキストが違う変数を2つ作成する.
In[10]:=
Click for copyable input
Out[10]=
$ContextPathに使いたいコンテキストを付け足しておく. 通常,Mathematica は新しいコンテキストを$ContextPathの始めに加える.
In[11]:=
Click for copyable input
Out[11]=
ここでと入力すると,コンテキストのシンボル,つまりモル数を表すためのシンボルが選択される.
In[12]:=
Click for copyable input
Out[12]=

簡略名だけで参照すると,通常,検索パスで先に現れるコンテキストにある同名のシンボルが選択される.このため,検索パスの後の方で現れるコンテキストに同名のシンボルがある場合や,現行のコンテキストに同盟のシンボルがある場合,これらのシンボルは隠されてしまう.隠されたシンボルを参照するには,コンテキストを含む完全名を指定する必要がある.

$ContextPathで既存のシンボルを隠してしまうような新しいシンボルを導入した場合,メッセージが出力される.また,ノートブックフロントエンドが赤く色付けすることで隠されたシンボルを警告する.

大域コンテキストに簡略名でシンボルを作る.入力すると,同じ簡略名で別のシンボルがある旨が警告される.
In[13]:=
Click for copyable input
Out[13]=
単にと参照すると,コンテキストパスに最初に出てくるシンボルが選択されてしまう.
In[14]:=
Click for copyable input
Out[14]=

既存のシンボルを隠してしまうようなシンボルを一度導入してしまうと,$ContextPathを変更して検索パス指定のコンテキストの並び順を変えるか,シンボル自体を除去するまでは遮蔽効果が続いてしまう.除去するには単にシンボルの持つ値を消すだけでは不十分で,シンボル自体を消し去る必要がある.除去はRemove[s]を使い行う.

Clear[s]シンボルの持つ値を消去する
Remove[s]シンボル自体を除去する

シンボルの消去と除去

シンボルを除去する.
In[15]:=
Click for copyable input
また,を参照すると,今度はシンボルが選択される.
In[16]:=
Click for copyable input
Out[16]=

シンボル名が出力されるとき,Mathematica はその正式名と簡略名のどちらかを出力に使う.実際に出力される名前は,現行コンテキスト$Contextと検索パス$ContextPathの現行設定に対応して,該当シンボルを取得するために必要な名前である.

最初のシンボルは簡略名で表示される.指定するときも簡略名だけだと最初のシンボルが選択される.
In[17]:=
Click for copyable input
Out[17]=

簡略名を入力し,その名前に相当するシンボルがどのコンテキストにも存在しない場合は,それは新規のシンボルとして生成される.そのとき,新規シンボルは$Contextにある現行コンテキストにおいて作られる.

簡略名を入力すると,シンボルが新規に作られる.
In[18]:=
Click for copyable input
Out[18]=
現行コンテキストはだから,シンボルはそこにできる.
In[19]:=
Click for copyable input
Out[19]=
New to Mathematica? Find your learning path »
Have a question? Ask support »