一度に複数の処理をまとめて行い、 一つの値を結果として返したいという場合があります。 そういうときに使えるのがblock関数です。 block関数の書式は次のとおりです。最初の構文は単純に式1から式nまでを順番に実行し 最後の式の結果をblock全体の式の結果とします。 二番目の構文は、v1からvnまでをローカル変数として 宣言してから式を順番に実行します。 ローカル変数というのは、block文の中だけで使える変数のことです。 もしblock文の外側にある変数と同じ変数を宣言した場合 外側にある変数は一時的に隠れて block文が終わったときに元の値に復帰します。 blockの中にblockを使うことも加能です。 blockを使うのは主に関数を定義する時になるでしょう。 block関数を使った例をあげます。block関数の書式
block(式1,...,式n) block([v1,...,vn],式1,...,式n)最後の例は与えられたリストの和を返す関数です。 iをカウンタ、nを和を保存するためのローカル変数として定義しています。 最後にreturnについて説明します。 もし、blockの途中で処理を終了して結果を返したいような場合、 returnを使います。 returnはblockの途中であっても、returnが呼ばれた時点で 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この例では、リストが空だった場合は直ちに警告の文字列を返します。 さもなくば、和を計算してその値を返します。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