モジュールと局所変数
Mathematica では,ユーザ定義の変数は通常大域的なものとみなされる.このため,同じ名前,例えば,
xが入力されるたびに,それは同一のオブジェクトを参照するためのものとされる.
しかし,特にプログラムの記述においては,必ずしもすべての変数を大域的なものとはしたくないことがある.例えば,同じ
xの名前を使い,2つのプログラムにある別々の2つの変数を参照したいかもしれない.このようなときは,
xを各プログラムにおいて局所変数として扱われるようにしておく必要がある.
Mathematica では,モジュールを使うことで局所変数の定義を行うことができる.モジュールの中に与えられた変数は,モジュール内だけで有効な局所変数として扱われる.
| Module[{x,y,...},body] | 局所変数 x, y, ... を備えたモジュール |
モジュールの作成
| Out[1]= |  |
|
モジュール中の tは局所化されている.このため,先に作った大域変数の tとは独立に扱うことができる. |
| Out[3]= |  |
|
モジュールの最も一般的な使いみちは,定義したい関数の中で一時的(臨時的)な変数を設けることである.そのような変数はモジュール内だけで有効な局所変数にしておくことが重要である.局所変数にしておかないと,同じ参照名を持つ変数が外部にある場合,競合してしまい思いも寄らない間違いを引き起してしまう.
臨時変数 tはモジュールに局所になるように指定される. |
| Out[5]= |  |
|
| Out[6]= |  |
|
モジュール内では,局所変数はいわゆる変数だけでなく他のシンボルと同じように使うことができる.例えば,局所関数の名前として使うことができる.また,局所変数に属性を割り当てることもできる.
| Out[8]= |  |
|
| Out[9]= |  |
|
あるモジュールで局所変数が設けられるとき,
Mathematica はその変数に対しての値の割当ては行わない.このため,モジュールの外に同じ名前の大域変数がすでにあったとしても,それを純粋なシンボルとして使うことができる.
上の例で定義した tの大域値が使われる.このため,ある数が返される.
| Out[10]= |  |
|
| Out[11]= |  |
|
局所変数 tには値が割り当てられていないので,シンボルとして扱われる.このため, Expandは,期待される代数式的な結果を生成する.
| Out[12]= |  |
|
| Module[{x=x0,y=y0,...},body] |
| モジュールの局所変数に初期値を割り当てる |
局所変数の初期化
| Out[14]= |  |
|
初期値の定義はモジュールのどの局所変数に対してでも行うことができる.初期値は常にモジュールが実行される前に評価される.このため,モジュールに対して局所的に定義された変数
xがあっても,名前
xがある初期値の設定を行うための式に現れるときは,大域の
xが使われる.
| Out[15]= |  |
|
| lhs:=Module[vars,rhs/;cond] | 右辺 rhs と条件式 cond の間で局所変数を共有する |
条件付き定義における局所変数の使用
ある定義に対して
/;条件式を設ける際は,一時的な変数を導入する必要がよく出てくる.多くの場合は,一時変数を定義の右辺にある本体式とで共有できるようにしたい.このような共有を行うには,条件式を含める形で定義の右辺をモジュールの角カッコに入れておく.
局所変数 tの値は,条件式と右辺の本体式で共有される.
| Out[17]= |  |
|