|
2.7.8 コンテキスト
変数名と関数名は,できるだけ具体的な名前にした方がよい.だからといって,あまり長いのも考えものである.
Mathematicaでは,「コンテキスト」と呼ばれる考え方が使われシンボルの名前を構成することができるようになっている.コンテキストは, Mathematicaのパッケージを使うときに特に重要で,あるパッ ケージで導入されたシンボルの名前が他のシンボルの名前と競合しないようにするために使われる. ユーザ自身でパッケージを記述する場合や,市販パッケージの中身を変更するような場合には,コンテキストについて詳しい知識を持つ必要がある.
対象になるオブジェクトが何であれ,その正式名称は必ず2つの部分からなる.すなわち,正式名はコンテキスト名と簡略名(いわゆる名前)からなり,「コンテキスト`簡略名」の書式で記述される. Mathematicaにおいて,記号 `は(ASCII文字コード番号は10進数の96)コンテキストマークと呼ばれる.
一例として,コンテキストが aaaaで簡略名が xからなるシンボルの正式名を作ってみる.
In[1]:= aaaa`x
Out[1]= 
今作ったシンボルを使ってみる.他のシンボルと同様に使うことができる.
In[2]:= %^2 - %
Out[2]= 
このシンボルには,どんな値でも定義することができる.
In[3]:= aaaa`x = 78
Out[3]= 
a`xと b`xは全く別のものとして扱われる.
In[4]:= a`x == b`x
Out[4]= 
定義したいシンボルの種類に依存してコンテキストを使い分けるとよい.例えば,物理単位を表したシンボルには,特別なコンテキストPhysicalUnits`を使ったりすることができる.そうすると,単位記号の正式名はPhysicalUnits`Joule(ジュール)とかPhysicalUnits`Mole(モル)とかになる.
正式名を使わなくても,普通は,短くて便利な簡略名だけで間に合う.
現行セッションの任意位置において,現行のコンテキスト$Contextは必ず1つだけある.シンボルが現行コンテキストにあるのなら,その参照には単に簡略名を使うだけでよい.
MathematicaセッションにおけるデフォルトのコンテキストはGlobal`(大域)である.
In[5]:= $Context
Out[5]= 
シンボルが現行コンテキストになるなら,簡略名だけでそれを参照することができる.
In[6]:= {x, Global`x}
Out[6]= 
コンテキストは,いくつかの面で,多くのオペレーティングシステムで使われているファイルのディレクトリに似ている.例えば,ファイルを指定するには,ファイル名とディレクトリ名を一緒に指定すれば確実にできる.しかし,現行ディレクトリにあるファイルなら,いちいちディレクトリ名を指定する必要はない.
多くのオペレーティングシステムにおけるディレクトリがそうであるように, Mathematicaのコンテキストも階層構造を取っている.例えば,シンボルが3つのコンテキストからなる階層位置におかれている場合,その正式名は, ` ` `nameとなる.

コンテキストの指定法
コンテキスト a`b`においてシンボルを作る.
In[7]:= a`b`x
Out[7]= 
Mathematicaのセッションが始まる時点では,コンテキストは Global`(大域的)にされる.普通は,このコンテキストにオブジェクトを作成していくことになる.例外として, Pi等の組込み定数はSystem`(システム)コンテキストに定義される.
Global`だけでなく, System`のようなよく使われるコンテキストは特別な操作なしで使うことができると便利である.そこで,コンテキストの検索パスと呼ばれるオブジェクトが提供されているので,それを使うことで自動的なアクセスを可能にすることができる.また,現行コンテキストはパラメータ $Contextに登録される.検索パスは $ContextPathに保持される.コンテキスト名が検索パスにあれば,そのコンテキストにあるオブジェクトを参照するときに特にそのコンテキストを指定する必要はない.簡略名だけで指定できる.
Mathematicaのコンテキスト検索パスは,プログラムファイルを探すためのUnixやMS-DOSで使われる「サーチパス」に相当する.
コンテキスト検索パスにはシステムコンテキストも含まれている.
In[8]:= $ContextPath
Out[8]= 
Piのコンテキストはシステム(System`Pi)である.
In[9]:= Context[Pi]
Out[9]= 

コンテキスト関連の機能
違うコンテキストならば,簡略名は同じであっても構わない.例えば,物理単位コンテキスト PhysicalUnits`と生物コンテキスト BiologicalOrganisms`と呼ばれるコンテキストを作ったとする.すると,そのどちらのコンテキストにも, Moleの同一名でシンボルを作成することができる.
それでは,簡略名Moleだけを指定すると,どちらの変数が実際に選択されるだろうか.検索パスのリストでより先に指定してあるコンテキストが優先される.
簡略名を Moleとするコンテキストが違う変数を2つ作成する.
In[10]:= {PhysicalUnits`Mole, BiologicalOrganisms`Mole}
Out[10]= 
検索パスに使いたいコンテキストを付け足しておく.
In[11]:= $ContextPath = Join[$ContextPath, {"PhysicalUnits`", "BiologicalOrganisms`"}]
Out[11]= 
パスには物理単位コンテキストを先に指定したので単位としての Mole,つまり,モル数を表すためのシンボルが選択される.
In[12]:= Context[Mole]
Out[12]= 
簡略名だけで参照すると,通常,検索パスより先に指定されたコンテキストにある同名のシンボルが選択される.このため,もし,後の方に指定されたコンテキストに同名のシンボルがあると,最初のコンテキストのシンボルで後のシンボルは隠れてしまう.隠されたシンボルを参照するには,コンテキストを含む正式名を指定する必要がある.
$ContextPathを選択していると,既存のシンボルを隠してしまうような新しい シンボルを導入した場合,警告が出される.通常,ノートブック型のフロントエンドを 使っている場合は,保存しておきたいシンボルを選ぶことができる.
大域コンテキスト Global`に簡略名 Moleでシンボルを作る.入力すると,同じ名前で別のシンボルがある旨が警告される.
In[13]:= Global`Mole

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

シンボルの消去と除去
シンボル Global`Moleを除去する.
In[15]:= Remove[Mole]
また,Moleを参照すると,今度は,単位系のモル数PhysicalUnits`Moleが選択される.
In[16]:= Context[Mole]
Out[16]= 
シンボル名が出力されるとき, Mathematicaはその正式名と簡略名のどちらかを出力に使う.実際に出力される名前は,現行コンテキスト $Contextと検索パス $ContextPathの現行設定に対応して,該当シンボルを取得するために必要な名前である.
最初のシンボルは簡略名で表示される.指定するときも簡略名だけだと最初のシンボルが選択される.
In[17]:= {PhysicalUnits`Mole, BiologicalOrganisms`Mole}
Out[17]= 
簡略名を入力し,その名前に相当するシンボルがどのコンテキストにも存在しない場合は,それは新規のシンボルとして生成される.そのとき,新規シンボルは$Contextにある現行コンテキストにおいて作られる.
簡略名 treeを入力すると,シンボルが新規に作られる.
In[18]:= tree
Out[18]= 
現行コンテキストは Global`だから,シンボルはそこにできる.
In[19]:= Context[tree]
Out[19]= 
|