コンテキスト

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

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

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

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

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

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

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

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

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

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

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

コンテキストの指定法

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

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

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

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

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

コンテキスト関連の機能

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

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

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

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

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

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

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

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

シンボルの消去と除去

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

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

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

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

簡略名treeを入力すると,シンボルが新規に作られる.
In[18]:=
Click for copyable input
Out[18]=
現行コンテキストはGlobal`だから,シンボルtreeはそこにできる.
In[19]:=
Click for copyable input
Out[19]=
Translate this page: