ブロックとモジュールの比較
Mathematica でプログラムを記述するとき,構成部分(計算式等)をなるべく独立した形で書くことが大切である.各部分を独立させて書くことで,保守や補修がやりやすいプログラムを構築することができる.
独立型のプログラムを書く上でよく取られる方法は,使う変数のスコープ(適用範囲)を限定する方法である.これは,基本的にモジュールとブロックを使い行う.
実際のプログラムを書くとき,モジュールはブロックより多く使われる.しかし,対話的な計算ではスコープ指定が必要となるため,ブロックを使った方が便利なことがよくある.
ほとんどの従来型のプログラミング言語では,いわゆる「レキシカルなスコープの限定法」が使われ変数の有効範囲を指定するようになっている.この方法は Mathematica のモジュールに相当する.シンボル処理系の言語にLISPがあるが,そこでは,「ダイナミックなスコープの限定」もできるようになっている.これは,Mathematica のブロックに相当している.
レキシカルな限定を行うと,変数の参照名は局所化され,プログラムコードの一部分だけでしか参照することができないようになる.これに対して,ダイナミックな限定を行うと,局所化は変数の値に対して行われ,値はプログラム実行における時間的な履歴の一区間だけで有効になる.
CやJavaのようなコンパイル系の言語ではコード体系と実行履歴体系をはっきりと区別することができる.シンボル処理系の Mathematica 言語では,この境界はやや曖昧である.それというのも,Mathematica では実行中のプログラムからダイナミックにコードを生成することも可能だからである.
あるプログラムでモジュールModule[vars, body]を使うと,このモジュールのコードが実行されるときになって初めて式 body は処理の対象になる.そして,変数 vars は,実際に変数の参照がコードに現れた時点で初めて局所化される.
ブロック式Block[vars, body]では式 body の形は無視される.その代り,式 body が評価される間は vars の値はずっと局所的なものとされる.
| In[1]:= |
| Out[1]= |
| In[2]:= |
| Out[2]= |
| In[3]:= |
| Out[3]= |
