maxima入門

ブロックとローカル変数(block)

一度に複数の処理をまとめて行い、
一つの値を結果として返したいという場合があります。
そういうときに使えるのがblock関数です。

block関数の書式は次のとおりです。

block関数の書式

block(式1,...,式n) block([v1,...,vn],式1,...,式n)
最初の構文は単純に式1から式nまでを順番に実行し 最後の式の結果をblock全体の式の結果とします。 二番目の構文は、v1からvnまでをローカル変数として 宣言してから式を順番に実行します。 ローカル変数というのは、block文の中だけで使える変数のことです。 もしblock文の外側にある変数と同じ変数を宣言した場合 外側にある変数は一時的に隠れて block文が終わったときに元の値に復帰します。 blockの中にblockを使うことも加能です。 blockを使うのは主に関数を定義する時になるでしょう。 block関数を使った例をあげます。

block関数の例

(%i1) block(print(1),print(2),print(3)); 1 2 3 (%o1) 3 (%i2) i:3$block([i:0],print(i)); 0 (%o2) 0 (%i3) i (%o3) 3 (%i4) mysum(list) := block([i,n:0],for i in list do n:n+i,n); (%o4) mysum(list):=block([i,n:0],for i in list do n:n+i,n) (%i5) mysum([1,2,3]); (%o5) 6
最後の例は与えられたリストの和を返す関数です。 iをカウンタ、nを和を保存するためのローカル変数として定義しています。 最後にreturnについて説明します。 もし、blockの途中で処理を終了して結果を返したいような場合、 returnを使います。 returnはblockの途中であっても、returnが呼ばれた時点で block全体の結果として値を返します。

returnの使用

(%i1) sumorwarn(list) := block([i,n:0],if emptyp(list) then return("list is empty") else for i in list do n:n+i,n); (%o1) sumorwarn(list):=block([i,n:0],if emptyp(list) then return("list is empty") else for i in list do n:n+i,n) (%i2) sumorwarn([]) (%o2) "list is empty" (%i3) sumorwarn([1,2,3]) (%o3) 6
この例では、リストが空だった場合は直ちに警告の文字列を返します。 さもなくば、和を計算してその値を返します。
since 2014/03/23