|
2.7.9 コンテキストとパッケージ
Mathematica言語で書かれたパッケージにはパッケージの外部で使うために設けられた各種のシンボルが入っている.
一般規約として,パッケージの読込み時に定義される新規のシンボルはすべて個別のコンテキスト,つまり,そのパッケージに関連付けられたコンテキストに入れられることになっている.パッケージが読み込まれる際は,適切なコンテキストが検索パス $ContextPathの先頭に付け加えられる.
パデ(Padé)近似パッケージを読み込ませる.
In[1]:= <<Calculus`Pade`
検索パスの先頭にこのパッケージのコンテキストが付け足される.
In[2]:= $ContextPath
Out[2]= 
シンボルPadeはパデパッケージのコンテキストに入っている.
In[3]:= Context[Pade]
Out[3]= 
検索パスにコンテキスト指定があるので,簡略名だけで参照できる.
In[4]:= Pade[Exp[x], {x, 0, 2, 4}]
Out[4]= 
パッケージにあるシンボルには非常に長い参照名を持つものが数多くある.しかし,それらの参照は,ほとんどの場合,簡略名だけで間に合う.パッケージが読み込まれると同時に,パッケージのコンテキストが検索パスに付け足されるからである.簡略名を入力すると,パスが自動検索されるため適切なコンテキストが判明する.
それでも問題が起らないとは限らない.2つのパッケージを使い,そのどちらにも同じ簡略名の変数があると競合が起ってしまう.実際にパッケージを読み込ませると,2つ目が読み込まれる際には警告が発せられ,新しいパッケージのシンボルにより先のパッケージのシンボルが隠蔽されてしまうという旨が表示される.
新たにパッケージを読み込ませる.すると, Calculus`Pade`のコンテキストにあるシンボル Padeが新しいシンボルで隠蔽されてしまう.
In[5]:= <<NewPade`

それでも,正式名を使えば参照することができる.
In[6]:= Calculus`Pade`Pade[Exp[x], {x, 0, 2, 4}]
Out[6]= 
競合状態は何もパッケージ間だけで起るものではない.読み込まれたパッケージとユーザが現行セッションで直接入力したものとの間でも起り得る.現行コンテキストで何かシンボルを定義したとすると,読み込むパッケージに同名のシンボルがあると,後者は隠されてしまう.理由は,現行コンテキストが検索パスのコンテキストより優先されるためである.
現行コンテキストに関数を1つ定義する.
In[7]:= Div[f_] = 1/f
Out[7]= 
現行コンテキストの定義が優先されるので,パッケージから読み込ませた Div関数が隠れてしまう.
In[8]:= <<Calculus`VectorAnalysis`

直交座標系を選択しベクトル解析の準備をする.
In[9]:= SetCoordinates[Cartesian[x, y, z]]
Out[9]= 
現行コンテキストからユーザ定義の Divを完全に除去しておく.
In[10]:= Clear[Div]; Remove[Div]
パッケージの Divが有効になった.
In[11]:= Div[{x, y^2, x}]
Out[11]= 
シンボルの隠蔽問題が起ったら,まず, Remove[s]を使い必要でなくなったシンボルを除去する.それでも問題が解消しないときは,検索パス $ContextPathや現行コンテキスト $Contextを再編集し,必要なシンボルを含むコンテキストが先に検索されるようにする.

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