|
2.7.7 ブロックとモジュールの比較
Mathematicaでプログラムを記述するとき,構成部分(計算式等)をなるべく独立した形で書くことが大切である.各部分を独立させて書くことで,保守や補修がやりやすいプログラムを構築することができる.
独立型のプログラムを書く上でよく取られる方法は,使う変数のスコープ(適用範囲)を限定する方法である.これは,基本的にモジュールとブロックを使い行う.
実際のプログラムを書くとき,モジュールはブロックより多く使われる.しかし,対話的な計算ではスコープ指定が必要となるため,ブロックを使った方が便利なことがよくある.

スコープ限定の対象
ほとんどの従来型のプログラミング言語では,いわゆる「レキシカルなスコープの限定法」が使われ変数の有効範囲を指定するようになっている.この方法は Mathematicaのモジュールに相当する.シンボル処理系の言語にLISPがあるが,そこでは,「ダイナミックなスコープの限定」もできるようになっている.これは, Mathematicaのブロックに相当している.
レキシカルな限定を行うと,変数の参照名は局所化され,プログラムコードの一部分だけでしか参照することができないようになる.これに対して,ダイナミックな限定を行うと,局所化は変数の値に対して行われ,値はプログラム実行における時間的な履歴の一区間だけで有効になる.
CやJavaのようなコンパイル系の言語ではコード体系と実行履歴体系をはっきりと区別することができる.シンボル処理系の Mathematica言語では,この境界はやや曖昧である.それというのも, Mathematicaでは実行中のプログラムからダイナミックにコードを生成することも可能だからである.
あるプログラムでモジュール Module[vars, body]を使うと,このモジュールのコードが実行されるときになって初めて式 bodyは処理の対象になる.そして,変数 varsは,実際に変数の参照がコードに現れた時点で初めて局所化される.
ブロック式Block[vars, body]では式 bodyの形は無視される.その代り,式 bodyが評価される間は変数の値はずっと局所的なものとされる.
mに iの式を割り当てる.
In[1]:= m = i^2
Out[1]= 
このブロックの i + mの計算では, iには局所値が使われる.
In[2]:= Block[{i = a}, i + m]
Out[2]= 
モジュールでは, i + mで現れる iだけが局所変数として扱われる.
In[3]:= Module[{i = a}, i + m]
Out[3]= 
|