• 検索結果がありません。

MAXIMA での函数の定義

ドキュメント内 , (ページ 124-128)

第 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ラベルに出力する事です.

ドキュメント内 , (ページ 124-128)