局所定数
| With[{x=x0,y=y0,...},body] | 局所定数 x, y, ... を定義する |
局所定数の定義
Moduleを使うと局所変数を設定し,それに値を割り当て.変更することができる.しかし,多くの場合,本当に必要なものは一度だけ値が割り当てられる局所定数だけである.Mathematica では,局所変数の設置は構成体Withを使い行うことができる.

に対し大域値を定義する.
| Out[1]= |  |

を局所定数として使い関数を定義する.

の定義が適用される.
| Out[3]= |  |

は最初に割り当てられた大域値のままである.
| Out[4]= |  |
Moduleにおいてそうであったように,Withにおいても,そこで定義される初期値はWithが実行される前に評価される.
局所定数

の値を与える式

は大域の

が使われ評価される.
| Out[5]= |  |
With[{x=x0, ...}, body]の機能の仕方としては,まず,body が取り出され,次に,式中に現れる x 等の各オブジェクトがそれに対応した値
等で置換される.Withは一般化された演算子
ととらえることができ,式でなく Mathematica コードに適している.

を

に置換する.
| Out[6]= |  |
置換後は,
Withの本体式は

になり,

には値

が割り当てられる.
| Out[7]= |  |

の値を消去しておく.
見方によっては,Withは局所変数が必ず1回しか値が割り当てられないModuleの特殊ケースのようなものである.
Withを使う1つの大きな理由は,多くの場合,Moduleより読みやすい計算プログラムを書くことができるからである.Moduleを使うとすると,局所変数(例えば,x)の値を確認するには,x が参照されるたびに,そこまでの式をすべてトレースしなければならない.その点,Withを使うと,どこに x があってもその値は同じなので,単に初期値を見るだけでよい.コードをトレースする必要はない.
複数のネストされたWith構成体があるとき,同じ参照名の局所変数が複数存在してしまう場合がある.そのときは,常に,最も内側の部分に置かれた変数の定義が有効とされる.ModuleとWithは混ぜて使うことができる.そのときも,一般則として,有効とされる変数は最も内側の変数である.
ネストされた
With構成体で有効とされる変数は最も内側のものである.
| Out[9]= |  |
| Out[10]= |  |
内側の構成体にある局所変数が外側にある変数を隠すようなことはない.変数名が同じ場合はその限りではない.
| Out[11]= |  |
x と body がいつ評価されるかの問題を除けば,With[{x=x0, ...}, body]は,基本的に式
と同様に機能する.しかし,body に別のWith式やModule式があるとき,Withは特殊な動作を取る.ここで重要な点は,Withにある局所定数の間と,そして局所定数と大域オブジェクトの間で競合が起らないようにすることである.実際にどうすればこれができるかは「モジュールの動作の仕方」を参照のこと.
内側の
Withにある

は名前が変更され,大域の

と競合しないようにされる.
| Out[12]= |  |