|
2.3.10 省略可能な引数を持った関数の定義
複雑な関数を定義する際は,引数のいくつかを「省略可能な引数」としたいことがよくあるだろう.具体的な引数が与えられないときは,特定の「デフォルト」の値が自動的に採用されるようにしておきたい.
Mathematicaの組込み関数では,以下に示す2つの方法のどちらかにより省略可能な引数への対応が図られる.ユーザ定義の関数でも,そのどちらかの方法を使うことができる.
第1の方法では,引数の位置に従い個々の引数の重要度を決定し,重要でないものから省略されたものとみなし除外する.そして,それらをデフォルト値に置き換える.Mathematicaのほとんどすべての組込み関数では,この方法が使われ末尾の引数から除外されていく.例えば,平坦化を行うための組込み関数Flatten[list, n]では,第2引数は与えられなくてもよい.与えられなければデフォルト値であるInfinityが代りに使われる.
このような位置に基づいたデフォルト値付き引数の設定をユーザ関数で行うには,_:パターンを 使う.

位置に基づいたデフォルト値付き引数を持った関数の定義
第2引数は省略可とする.デフォルト値Infinityが使われる.
In[1]:= f[list_, n_:Infinity] := f0[list, n]
今度は,省略可能な引数を2つ持つ関数を定義する.
In[2]:= fx[list_, n1_:1, n2_:2] := fx0[list, n1, n2]
Mathematicaは,最後の引数から除外していくものとする.このため,mはn1の値を与え,n2はデフォルト値2を取る.
In[3]:= fx[k, m]
Out[3]= 
組込み関数における省略可能な引数への対応で取られる第2の方法は,省略可能な引数に固有の参照名を与えておき,変換規則を使うことで,引数が省略されたときに取られる代替値を決めておく,という方法である.この方法は,Plotのような非常に多くの省略可能な引数を持った関数で特に便利になる.実際に関数を使うときは,限られた数の引数を与えるだけで関数は機能する.
通常の手順としては,特定の関数に与えられる引数に続ける形で適切な変換規則を含めることで,「参照名付き」の省略可能な引数を指定することができる.例えば,関数Plotの取る引数PlotJoinedは省略可能だが,特に値を指定するなら,PlotJoined->Trueの規則を作っておき,ListPlot[list, PlotJoined->True]というように他の引数に続けて入力しておく.
また,任意関数f において引数を省略可能なものとし,それらのデフォルト値を設定するにはOptionsを使う.関数がfなら,Options[f] に引数のデフォルト値を指定した変換規則をリスト形式で割り当てる.

参照名付き引数
関数fnに省略可能な参照名付き引数を2つ設ける.参照名をopt1とopt2にし,規則を使いデフォルト値を指定する.
In[4]:= Options[fn] = { opt1 -> 1, opt2 -> 2 }
Out[4]= 
opt1のデフォルト値を設定する.
In[5]:= opt1 /. Options[fn]
Out[5]= 
こうすると,opt1->3の規則が最初に適用される.このため,Options[fn]でopt1のデフォルト値は使われない.
In[6]:= opt1 /. opt1->3 /. Options[fn]
Out[6]= 
省略可能な参照名付き引数を持った関数fnを定義する.
In[7]:= fn[x_, opts___] := k[x, opt2/.{opts}/.Options[fn]]
省略可能な引数を指定しなかったため,opt2にはデフォルト値が使われる.
In[8]:= fn[4]
Out[8]= 
opt2に対して変換規則を与えると,この規則は,Options[fn]で保存されたデフォルトの規則が試される前に使われる.
In[9]:= fn[4, opt2->7]
Out[9]= 
|