ブロックとモジュールの比較

Wolfram言語でプログラムを記述するとき,構成部分(計算式等)をなるべく独立した形で書くことが大切である.各部分を独立させて書くことで,保守や補修がやりやすいプログラムを構築することができる.

独立型のプログラムを書く上でよく取られる方法は,使う変数のスコープ(適用範囲)を限定する方法である.これは,基本的にモジュールとブロックを使い行う.

実際のプログラムを書くとき,モジュールはブロックより多く使われる.しかし,対話的な計算ではスコープ指定が必要となるため,ブロックを使った方が便利なことがよくある.

Module[vars,body]レキシカルなスコープ限定
Block[vars,body]ダイナミックなスコープ限定

スコープ限定の対象

ほとんどの従来型のプログラミング言語では,いわゆる「レキシカルなスコープの限定法」が使われ変数の有効範囲を指定するようになっている.この方法はWolfram言語のモジュールに相当する.シンボル処理系の言語にLISPがあるが,そこでは,「ダイナミックなスコープの限定」もできるようになっている.これは,Wolfram言語のブロックに相当している.

レキシカルな限定を行うと,変数の参照名は局所化され,プログラムコードの一部分だけでしか参照することができないようになる.これに対して,ダイナミックな限定を行うと,局所化は変数の値に対して行われ,値はプログラム実行における時間的な履歴の一区間だけで有効になる.

CやJavaのようなコンパイル系の言語ではコード体系と実行履歴体系をはっきりと区別することができる.シンボル処理系のWolfram言語では,この境界はやや曖昧である.それというのも,Wolfram言語では実行中のプログラムからダイナミックにコードを生成することも可能だからである.

モジュールModule[vars,body]を使うと,このモジュールがWolfram言語プログラムのコードとして実行されるときに初めて式 body が処理の対象になる.モジュールは式を調べ,変数 vars のいずれかが,明示的にコードに現れた時点で初めて局所化される.その後通常の評価が行われる.

ブロック式Block[vars,body]では式 body の形は無視される.その代り,それぞれの vars の現行の値が記録される.式 body が評価される間は vars の値はずっと局所的なものとされ,body の評価が終了するともとの値に戻される.

の式を割り当てる.
In[1]:=
Click for copyable input
Out[1]=
このブロックのの計算では,には局所値が使われる.
In[2]:=
Click for copyable input
Out[2]=
モジュールでは,で現れるだけが局所変数として扱われる.
In[3]:=
Click for copyable input
Out[3]=