[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.1 関数の定義

その最も単純な形式において,nameという名前の関数の定義は,以下のよう に見えます。

 
function name
  body
endfunction

妥当な関数名は,妥当な変数名のようなものです。すなわち,連続する文字,数 字およびアンダースコアであって,先頭が数字ではないものです。関数は, 名前のプールを変数と共有します。

関数の本体bodyは,Octaveステートメントから構成されます。これは, 定義の最も重要な部分です。なぜならば,この部分は,関数が実際に何を 実行するべきかを述べているからです。

たとえば,実行時に,端末のベルを鳴らす関数を示します(それが実行可能であ ると仮定します)。

 
function beep
  printf ("\a");
endfunction

printfステートメント(see section 入力と出力を参照)は,単に Octaveに文字列"\a"を表示するように伝えます。特殊文字"\a" は,警告文字(アスキーコード 7)を表します。See section 文字列.を参照して ください。

一度この関数を定義すると,関数名を打ち込むことにより,Octaveにそれを評 価するように伝えることができます。

普通なら,自分が定義した関数に,何らかの情報を渡したいと思うでしょう。 Octaveでは,ある関数にパラメータを渡すための文法は,

 
function name (arg-list)
  body
endfunction

となります。ここでarg-listは,関数の引数をカンマで区切ったリストで す。関数を呼び出すとき,引数の名前は,その呼び出しにおいて与えた引数値を 保持するために使用されます。引数のリストは空でもかまいません。この場合, この形式は,最初に示した形式と同じものになります。

ベルを鳴らすとともにメッセージを表示するには,beep関数を,以下に 示すように変更すればよいのです。

 
function wakeup (message)
  printf ("\a%s\n", message);
endfunction

以下のようなステートメントを用いて,この関数を呼び出すと,

 
wakeup ("Rise and shine!");

Octaveは,端末のベルを鳴らし,`Rise and shine!'というメッセージを 表示して改行(printfステートメントの最初の引数にある`\n') します。

大部分の場面において,自分で定義した関数から,何らかの情報を得たいこと もあるはずです。ある1つの値を返す関数を書くための文法は,以下のような ものです。

 
function ret-var = name (arg-list)
  body
endfunction

ret-varは,関数によって返される値を保持することになる変数名です。 この変数は,関数が値を返すようにするために,関数本体の終わりまでに定義さ れていなければなりません。

関数の本体において使用される変数は,その関数に対してローカルなものです。 arg-listおよびret-varに名前を挙げた変数も,その関数内のローカ ルなものです。関数内からグローバル変数にアクセスするための方法について, より多くの情報はSee section グローバル変数.を参照してください。

たとえば,あるベクトルの要素の平均値を計算する関数を示します。

 
function retval = avg (v)
  retval = sum (v) / length (v);
endfunction

もし,代わりに以下のようなavgを書いたとして,

 
function retval = avg (v)
  if (isvector (v))
    retval = sum (v) / length (v);
  endif
endfunction

さらに,引数としてベクトルの代わりに行列を用いて関数を呼び出すならば, Octaveは以下のようなエラーメッセージを表示することになるでしょう。

 
error: `retval' undefined near line 1 column 10
error: evaluating index expression near line 7, column 1

なぜならば,ifステートメントの本体は決して実行されず,retval は決して定義されないからです。このような目立たないエラーを避けるために, 戻り値が常に値をもつようにいつでも確認をしたり,問題に遭遇したときに,有用 なメッセージを出すことは良い心がけです。たとえば,avg関数は,以下の ように書いてあれば良かったのです。

 
function retval = avg (v)
  retval = 0;
  if (isvector (v))
    retval = sum (v) / length (v);
  else
    error ("avg: expecting vector argument");
  endif
endfunction

この関数には,まだもう一つの問題が存在します。もしこの関数が引数を付けずに 起動されたら?ということです。エラーチェックを追加しなくとも,おそらく Octaveは,実際にはエラーの原因を突き止める手助けにはならないような,エ ラーメッセージを表示するでしょう。このようなエラーを捕獲ことができるよ うにするために,Octaveには,各々の関数についてnarginなる自動設 定変数を提供しています。関数が呼び出されるたびに,narginは自動 的に,実際に関数に渡された引数の数に初期化されます。たとえば,avg を以下のように書き換えたとしましょう。

 
function retval = avg (v)
  retval = 0;
  if (nargin != 1)
    usage ("avg (vector)");
  endif
  if (isvector (v))
    retval = sum (v) / length (v);
  else
    error ("avg: expecting vector argument");
  endif
endfunction

期待したよりも多くの引数を付けてこの関数を呼び出すとき,Octaveは自動的にエ ラーを報告しませんが,おそらく何かがおかしいことを示します。引数の数が少な すぎるときも,Octaveはエラーを自動的に報告しませんが,値を与えられていない 変数を使用しようという試みは,エラーになるでしょう。このような問題を避け, 役立つメッセージを提供するためには,両方の可能性をチェックし,独自のエラー メッセージを出すようにします。

Built-in Function: nargin ()
Built-in Function: nargin (fcn_name)

ある関数の内部で,その関数に渡された引数の数を返す。トップレベルでは, Octaveに渡されたコマンドライン引数の数を返す。もしオプション引数 fcn_nameを付けて呼び出すならば,その関数が受け入れることのできる 引数の最大数を返す。もしその関数が不定数の引数を受け入れるならば,-1 を返す。

Built-in Variable: silent_functions

もしsilent_functionsの値がゼロでなければ,関数からの内部出力が抑 制される。そうでなければ,セミコロンで終わっていない関数本体内の式の結果 は,その値が出力される。標準状態は0である。

たとえば,もし以下の関数

 
function f ()
  2 + 2
endfunction

を実行するならば,Octaveはsilent_functionsの値に依存して, `ans = 4'と表示したり,何も表示しなかったりする。

Built-in Variable: warn_missing_semicolon

もしこの変数の値がゼロでないならば,関数定義内のステートメントがセミコ ロンで終わっていないときに警告を表示する。標準状態は0である。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]

This document was generated on July, 20 2006 using texi2html 1.76.