局所定数

With[{x=x0,y=y0,...},body]局所定数 x, y, ... を定義する

局所定数の定義

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

に対し大域値を定義する.
In[1]:=
Click for copyable input
Out[1]=
を局所定数として使い関数を定義する.
In[2]:=
Click for copyable input
の定義が適用される.
In[3]:=
Click for copyable input
Out[3]=
は最初に割り当てられた大域値のままである.
In[4]:=
Click for copyable input
Out[4]=

Moduleにおいてそうであったように,Withにおいても,そこで定義される初期値はWithが実行される前に評価される.

局所定数の値を与える式は大域のが使われ評価される.
In[5]:=
Click for copyable input
Out[5]=

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

に置換する.
In[6]:=
Click for copyable input
Out[6]=
置換後は,Withの本体式はになり,には値が割り当てられる.
In[7]:=
Click for copyable input
Out[7]=
の値を消去しておく.
In[8]:=
Click for copyable input

見方によっては,Withは局所変数が必ず1回しか値が割り当てられないModuleの特殊ケースのようなものである.

Withを使う1つの大きな理由は,多くの場合,Moduleより読みやすい計算プログラムを書くことができるからである.Moduleを使うとすると,局所変数(例えば,x)の値を確認するには,x が参照されるたびに,そこまでの式をすべてトレースしなければならない.その点,Withを使うと,どこに x があってもその値は同じなので,単に初期値を見るだけでよい.コードをトレースする必要はない.

複数のネストされたWith構成体があるとき,同じ参照名の局所変数が複数存在してしまう場合がある.そのときは,常に,最も内側の部分に置かれた変数の定義が有効とされる.ModuleWithは混ぜて使うことができる.そのときも,一般則として,有効とされる変数は最も内側の変数である.

ネストされたWith構成体で有効とされる変数は最も内側のものである.
In[9]:=
Click for copyable input
Out[9]=
ModuleWithの構成体は混ぜて使うこともできる.
In[10]:=
Click for copyable input
Out[10]=
内側の構成体にある局所変数が外側にある変数を隠すようなことはない.変数名が同じ場合はその限りではない.
In[11]:=
Click for copyable input
Out[11]=

xbody がいつ評価されるかの問題を除けば,With[{x=x0, ...}, body]は,基本的に式 と同様に機能する.しかし,body に別のWith式やModule式があるとき,Withは特殊な動作を取る.ここで重要な点は,Withにある局所定数の間と,そして局所定数と大域オブジェクトの間で競合が起らないようにすることである.実際にどうすればこれができるかは「モジュールの動作の仕方」を参照のこと.

内側のWithにあるは名前が変更され,大域のと競合しないようにされる.
In[12]:=
Click for copyable input
Out[12]=
New to Mathematica? Find your learning path »
Have a question? Ask support »