|
2.7.1 モジュールと局所変数
Mathematicaでは,ユーザ定義の変数は通常大域的なものとみなされる.このため,同じ名前,例えば, xが入力されるたびに,それは同一のオブジェクトを参照するためのものとされる.
しかし,特にプログラムの記述においては,必ずしもすべての変数を大域的なものとはしたくないことがある.例えば,同じ xの名前を使い,2つのプログラムにある別々の2つの変数を参照したいかもしれない.このようなときは, xを各プログラムにおいて局所変数として扱われるようにしておく必要がある.
Mathematicaでは,モジュールを使うことで局所変数の定義を行うことができる.モジュールの中に与えられた変数は,モジュール内だけで有効な局所変数として扱われる.

モジュールの作成
大域変数 tへの値17の割当てを定義する.
In[1]:= t = 17
Out[1]= 
モジュール中の tは局所化されている.このため,先に作った大域変数の tとは独立に扱うことができる.
In[2]:= Module[{t}, t=8; Print[t]]

大域な tの値は17のままである.
In[3]:= t
Out[3]= 
モジュールの最も一般的な使いみちは,定義したい関数の中で一時的(臨時的)な変数を設けることである.そのような変数はモジュール内だけで有効な局所変数にしておくことが重要である.局所変数にしておかないと,同じ参照名を持つ変数が外部にある場合,競合してしまい思いも寄らない間違いを引き起してしまう.
臨時変数 tはモジュールに局所になるように指定される.
In[4]:= f[v_] := Module[{t}, t = (1 + v)^2; t = Expand[t] ]
関数 fを実行させる.
In[5]:= f[a + b]
Out[5]= 
大域変数 tの値は17のままである.
In[6]:= t
Out[6]= 
モジュール内では,局所変数はいわゆる変数だけでなく他のシンボルと同じように使うことができる.例えば,局所関数の名前として使うことができる.また,局所変数に属性を割り当てることもできる.
局所関数 fを定義するモジュールを作る.
In[7]:= gfac10[k_] := Module[{f, n}, f[1] = 1; f[n_] := k + n f[n-1]; f[10]]
この局所関数 fは単なる普通の1階乗で ある.
In[8]:= gfac10[0]
Out[8]= 
この fは,一般化された階乗として機能 する.
In[9]:= gfac10[2]
Out[9]= 
あるモジュールで局所変数が設けられるとき, Mathematicaはその変数に対しての値の割当ては行わない.このため,モジュールの外に同じ名前の大域変数がすでにあったとしても,それを純粋なシンボルとして使うことができる.
上の例で定義した tの大域値が使われる.このため,ある数が返される.
In[10]:= Expand[(1 + t)^3]
Out[10]= 
ここで, Lengthは単に1つの数を引数として受け取る.
In[11]:= Length[Expand[(1 + t)^3]]
Out[11]= 
局所変数 tには値が割り当てられていないので,シンボルとして扱われる.このため, Expandは,期待される代数式的な結果を生成する.
In[12]:= Module[{t}, Length[Expand[(1 + t)^3]]]
Out[12]= 

局所変数の初期化
tを局所変数とし,初期値 uを割り当てる.
In[13]:= g[u_] := Module[{ t = u }, t += t/(1 + u)]
gの定義を使う.
In[14]:= g[a]
Out[14]= 
初期値の定義はモジュールのどの局所変数に対してでも行うことができる.初期値は常にモジュールが実行される前に評価される.このため,モジュールに対して局所的に定義された変数 xがあっても,名前 xがある初期値の設定を行うための式に現れるときは,大域の xが使われる.
uの初期値は tの大域値とされる.
In[15]:= Module[{t = 6, u = t}, u^2]
Out[15]= 

条件付き定義における局所変数の使用
ある定義に対して /;条件式を設ける際は,一時的な変数を導入する必要がよくでてくる.多くの場合は,一時変数を定義の右辺にある本体式とで共有できるようにしたい.このような共有を行うには,条件式を含める形で定義の右辺をモジュールの角カッコに入れておく.
関数を条件付きで定義する.
In[16]:= h[x_] := Module[{t}, t^2 - 1 /; (t = x - 4) > 1]
局所変数 tの値は,条件式と右辺の本体式で共有される.
In[17]:= h[10]
Out[17]= 
|