第 9 章 多項式について
12.1 MAXIMA での函数の定義
第 12 章 函数定義
118 第12章 函数定義
¶ ³
\(%i1) f(x):=(y:x,z:2+y,2*z);
(%o1) f(x) := (y : x, z : 2 + y, 2 z) (%i2) f(x);
(%o2) 2 (x + 2)
(%i3) y;
(%o3) x
(%i4) z;
(%o4) x + 2
(%i5) f(2);
(%o5) 8
(%i6) x;
(%o6) x
(%i7) y;
(%o7) 2
(%i8) z;
(%o8) 4
µ ´
この様に,先頭の式から順番に処理されて行き,最後の式の結果だけが返却されています.この函 数の場合,内部で用いた変数yとzの内容が書換えられている事に注意して下さい.
MAXIMAでは,函数内部だけで利用可能な変数,即ち,局所函数が使えます. この場合,後述の
block文を用いて函数を定義します.
MAXIMAのlambda式を用いると無名の函数が構築出来ます. このlambda函数の構文は以下
の様に最初に函数の変数を宣言し, その後に函数本体が続きます.函数本体は基本的にMAXIMA の式をコンマで区切ったものになります.
lambda([h変数1i,· · ·,h変数ni],h函数本体i)
構文自体は,LISPのlambda式と同様の構文となっています.
次の例ではlambda([i],2*i+1)で引数iに1を加える無名函数をmap函数でリスト[1,2,3]に 作用させた結果と,lambda式を利用した函数nekoを示しています.
¶ ³
(%i58) map(lambda([i],2*i+1),[1,2,3]);
(%o58) [3, 5, 7]
(%i59) neko(x):=map(lambda([i],sin(2*i+1)),x);
(%o59) neko(x) := map(lambda([i], sin(2 i + 1)), x) (%i60) neko([1,2,3,4,5]);
(%o60) [sin(3), sin(5), sin(7), sin(9), sin(11)]
(%i61) i;
(%o61) i
µ ´
MAXIMAでは引数の個数が可変な函数も定義出来ます.この場合,最後の引数を特別な引数リス
トとして割当てて函数を,定義します.尚,引数が少ない場合, 安易な処理を行っていると少し問題 になるかもしれません.
¶ ³
(%i41) f([u]):=u;
(%o41) f([u]) := u
(%i42) f(1,2,3,4,5);
(%o42) [1, 2, 3, 4, 5]
(%i43) f(a,b,[u]):=[a,b,u];
(%o43) f(a, b, [u]) := [a, b, u]
(%i44) f(1,2,3,4,5,6);
(%o44) [1, 2, [3, 4, 5, 6]]
(%i45) f(1,2);
(%o45) [1, 2, []]
µ ´
函数本体に含まれる式からの返却値が必要であれば,block文とreturn文を組合せます.
このblock文の構造は,block内部本体に変数リスト,処理を行う式をコンマで区切った式の列が
記述されています:
¶ ³
block($\langle 変 数 リ ス ト\rangle ,\langle 式_1\rangle ,\langle 式 _2\rangle ,\cdots,\langle 式_n\rangle $)
µ ´
ここで変数リストはblock文内部で用いる局所変数のリストです.局所変数を用いない場合に空 リスト[]を表記しても,局所変数リスト自体を省略しても構いません.各局所変数に初期値を設定 する事も可能で,例えば,局所変数としてa,b,cを用い,aに初期値2,cに空リストを設定する場合は
[a:2,b,c:[]]とします. 因に,この局所変数への値の束縛は動的束縛と呼ばれるものになります.
次に,returnはblock文の変数リスト以外の何処にでも置けます.returnを置かなかった場合に は,block文の末尾の式の値が返却値となります.
以下にblock文を用いた函数の例を示します.この函数では局所変数として, a,kを用いています.
¶ ³
(%i67) a:10;
(%o67) 10
(%i68) neko(x):=block([a:2,k],k:sin(x)*a,return(k));
(%o68) neko(x) := block([a : 2, k], k : sin(x) a, return(k)) (%i69) neko(10);
(%o69) 2 sin(10)
(%i70) a;k;
(%o70) 10
(%i71) k;
(%o71) k
µ ´
120 第12章 函数定義 この例で示す様に,局所変数はblock文内部でのみ利用され,同名の変数には影響を与えていま せん.
定義した函数の内容は函数dispfunやfundefで参照する事が出来ます.
(%i72) dispfun(neko);
(%t72) neko(x) := block([a : 2, k], k : sin(x) a, return(k))
(%o72) done
(%i73) fundef(neko);
(%o73) neko(x) := block([a : 2, k], k : sin(x) a, return(k))
dispfunとfundefは機能的には殆ど違いはありません.但し,dispfunの場合は,函数を%tラベル に表示するのに対して,fundefは%oラベルに出力する事です.