|
2.7.2 局所定数

局所定数の定義
Moduleを使うと局所変数を使うことができ,局所変数には一連の任意値を割り当てることができる.しかし,多くの場合,本当に必要なものは一度だけ値が割り当てられる局所定数だけである. Mathematicaでは,局所変数の設置は構成体 Withを使い行うことができる.
tに対し大域値を定義する.
In[1]:= t = 17
Out[1]= 
tを局所定数として使い関数を定義する.
In[2]:= w[x_] := With[{t = x + 1}, t + t^3]
wの定義が適用される.
In[3]:= w[a]
Out[3]= 
tは最初に割り当てられた大域値のままである.
In[4]:= t
Out[4]= 
Moduleにおいてそうであったように, Withにおいても,そこで定義される初期値は Withが実行される前に評価される.
局所定数 tの値を与える式 t + 1は大域の tが使われ評価される.
In[5]:= With[{t = t + 1}, t^2]
Out[5]= 
With[ x = , ... , body]の機能の仕方としては,まず,bodyが取り出され,次に,式中に現れる x等の各オブジェクトがそれに対応した値 等で置換される. Withは一般化された演算子 /.ととらえることができ,式でなく Mathematicaコードに適している.
xを aに置換する.
In[6]:= With[{x = a}, x = 5]
Out[6]= 
置換後は, Withの本体式は a = 5になり,aには値 5が割り当てられる.
In[7]:= a
Out[7]= 
aの値を消去しておく.
In[8]:= Clear[a]
見方によっては, Withは Moduleの特殊ケースのようなものである.両者の間の違いは, Withでは局所変数は必ず1回しか値が割り当てられない,ということにある.
Withを使う1つの大きな理由は,多くの場合, Moduleより読みやすい計算プログラムを書くことができるからである. Moduleを使うとすると,局所変数(例えば, x)の値を確認するには,xが参照されるたびに,そこまでの式をすべてトレースしなければならない.その点, Withを使うと,どこに xがあってもその値は同じなので,単に初期値を見るだけでよい.コードをトレースする必要はない.
複数のネストされた With構成体があるとき,同じ参照名の局所変数が複数存在してしまう場合がある.そのときは,常に,最も内側の部分におかれた変数の定義が有効とされる. Moduleと Withは混ぜて使うことができる.そのときも,一般則として,有効とされる変数は最も内側の変数である.
ネストされた With構成体で有効とされる変数は最も内側のものである.
In[9]:= With[{t = 8}, With[{t = 9}, t^2]]
Out[9]= 
Moduleと Withの構成体は混ぜて使うこともできる.
In[10]:= Module[{t = 8}, With[{t = 9}, t^2]]
Out[10]= 
内側の構成体にある局所変数が外側にある変数を隠すようなことはない.変数名が同じ場合はその限りではない.
In[11]:= With[{t = a}, With[{u = b}, t + u]]
Out[11]= 
xと bodyがいつ評価されるかの問題を除けば,With[ x =  , body]は,基本的に式 body /. x -> と同様に機能する.しかし, bodyに別の With式や Module式があるとき, Withは特殊な動作を取る.ここで重要な点は, Withにある局所定数の間と,そして局所定数と大域オブジェクトの間で競合が起らないようにすることである.実際にどうすればこれができるかは 2.7.3を参照のこと.
内側の Withにある yは名前が変更され,大域の yと競合しないようにされる.
In[12]:= With[{x = 2 + y}, Hold[With[{y = 4}, x + y]]]
Out[12]= 
|