純関数と規則で使う変数

ModuleWithを使えば,名前を局所的なものとした特定のシンボルをリストで一括に与えることができる.しかし,場合によっては,特定のシンボルを自動的に局所とすることができると便利である.

例えば,Function[{x},x+a]のような純関数を使うとき, は,局所的な特定の名前を持つ「仮パラメータ」として扱いたい.同じことは,のような規則や,のような定義に現れる に対しても言える.

Wolfram言語では一律の処理法が取られるので,純関数のような構成体に現れる仮パラメータは常に局所化された名前を持つ.したがって,大域的な名前と競合することはない.基本的な考えとしては,必要ならば,形を とする名前を持つシンボルで仮パラメータを置換する.規約に従い,は大域変数として使ってはいけない.

ネストされた純関数を定義する.
In[1]:=
Click for copyable input
Out[1]=
内側の関数で使われる仮パラメータ は名前を変更され,大域オブジェクト と競合しないようになる.
In[2]:=
Click for copyable input
Out[2]=
結果の純関数は期待通りの動作をする.
In[3]:=
Click for copyable input
Out[3]=

Function[vars,body]のようなオブジェクトで使われる仮パラメータは,body が他の純関数の動作により変更されるたびに別の名前に変えられる.

内側の純関数の本体式が変更したため,仮パラメータ は名前が変更される.
In[4]:=
Click for copyable input
Out[4]=
今度は,内側の関数の本体式は変更しない.このため,仮パラメータの名前は変更されない.
In[5]:=
Click for copyable input
Out[5]=

純関数で仮パラメータを使うと,その名前は変更されると説明したが,そのような処理は場合によっては不必要である.基本的に,純関数において仮パラメータの名前が純関数の本体式に代入される式の部分と競合しなければ,特に名前を変更する必要はない.しかし,一律性を維持するため,必要ないときも,仮パラメータの名前は変更される.

この例では,内側の関数にある仮パラメータ が関数の本体式をシールドしているので,名前の変更は必要ない.
In[6]:=
Click for copyable input
Out[6]=
3回ネストされた関数を作る.
In[7]:=
Click for copyable input
Out[7]=
2つの内側の関数はともに名前が変更される.
In[8]:=
Click for copyable input
Out[8]=

「純関数」で説明したように,Wolfram言語の純関数は形式論理で使われる 式のようなものである.Wolfram言語では,仮パラメータに対しての名前の変更を行うことで標準 式の機能をすべて実現可能にしている.

Function[{x,},body]局所パラメータ
lhs->rhs および lhs:>rhs局所パターン名
lhs=rhs および lhs:=rhs局所パターン名
With[{x=x0,},body]局所定数
Module[{x,},body]局所変数

スコープ限定構成体

Wolfram言語には,いくつかの「スコープ(有効範囲)限定のための構成体」を備えている.これらを使うことで,特定の名前を局所化することができる.また,これらの構成体が混ぜて使われるとき,Wolfram言語は,競合を防ぐように適切な名前の変更を行う.

競合を防ぐため,純関数で定義した仮パラメータは名前が変更される.
In[9]:=
Click for copyable input
Out[9]=
内側のWithにある局所変数は名前が変更され競合しないようになる.
In[10]:=
Click for copyable input
Out[10]=
この例では,競合がないので名前の変更はされない.
In[11]:=
Click for copyable input
Out[11]=
モジュールにある局所変数 は名前が変更されて競合しないようになる.
In[12]:=
Click for copyable input
Out[12]=
しかし,このモジュールを実行させると,局所変数は再び,固有の名前に変更される.
In[13]:=
Click for copyable input
Out[13]=

変換規則はスコープを限定するための構成体として扱われ,そこに与えられるパターンに対する名前は局所的な性格を持つ.名前付きのパターンは, 等を使い作成することができる.

にある に適合する.このため,規則から見ると局所的なものになる.
In[14]:=
Click for copyable input
Out[14]=

のような規則では右辺に現れる は引数パターンに適合する.このため, は規則に対して局所的な変数として扱われる.したがって,別の構成体で を別のスコープに変更することはできない.

これに対して, は規則から見ると局所的なものではないので,別の構成体でそのスコープを変更することが可能である.Wolfram言語は,競合を避けるためこの規則にあるパターンの名前を変更する.

規則にある は名前が変更され,競合しないようにされる.
In[15]:=
Click for copyable input
Out[15]=

スコープを限定する構成体にWithを使うと,Wolfram言語は自動的に適切な名前の変更を行う.しかし,場合によっては,名前の変更をせずに,スコープを限定する構成体の中において代入操作を行いたい.そのようなときは演算子を使う.

Withを使い の代入を行うと,純関数にある は適当な名前に変更され競合しないようにされる.
In[16]:=
Click for copyable input
Out[16]=
Withの代りにを使うと,名前の変更は行われない.
In[17]:=
Click for copyable input
Out[17]=

のような規則や, のような定義が適用されると,Wolfram言語は,右辺 rhs にあるすべての x に対して代入操作を施す.この代入操作は,演算子が実効的に使われて行われる.このため,この代入では,スコープ構成体によるスコープが効かなくなってしまう.ただし,あるスコープ構成体の内部のオブジェクトが代入操作により変更されるときは,そのスコープ構成体にある他の変数は名前が変更される.

純関数を生成するための関数を作る.
In[18]:=
Click for copyable input
演算子が実効的に使われ,は純関数に挿入される.
In[19]:=
Click for copyable input
Out[19]=
今度は,ペアのネストされた純関数を生成するための関数を作る.
In[20]:=
Click for copyable input
外側の純関数にある は名前が変更される.
In[21]:=
Click for copyable input
Out[21]=