GUST NOTCH? DIARY

関数の挙動

プチコン3号の内蔵ヘルプによると、DEF の項目には以下のように書いてある。

DEF 関数名([引数1 [,引数2]])
 戻り値の値は関数名の型に従う
戻り値の定義
 定義内のRETURNにより戻す

これは、ひとつ以下の値を返す場合の書き方。例として再帰による階乗を求める関数が出ている。

2つ以上の値を返す場合はOUTを使った構文になるが、戻り値がひとつの場合でも使える。

DEF 関数名 [引数1 [,引数2]] [OUT V1 [,V2 ...]]
戻り値の定義
 「OUT」に続く変数列(V1,V2...)により複数の戻り値を返す

「戻り値の値は関数名の型に従う」という記述はなくなっている。
この構文にしたがって、前述のFACTORIALを書き換えるとこうなる。

OUT を使った構文の場合でも、戻り値がひとつの場合は 「A=FACTORIAL(5)」のような形で受け取ることができる。もちろん「FACTORIAL 5 OUT A」とも書け、完全に等価のようだ。
次に以下のような例を考える

このBをB$に変えても同じように動作する

つまり、戻り値のラベルを「B$」と宣言しているが数値として扱われている。
逆に、以下のようなコードも動作する。

なので、こんなコードも通る。

さらにこんなのも通る。

DEF OUT の場合、関数名はただのラベルでしかないことがわかる。また、引数も同様であり、呼び出した側の型と実際の戻り値の型が合っていればエラーにならない。

一方、以下のコードは実行時にエラーになる場合がある。

関数内から値を返さないパスがある場合、エラーになるようだ。
(2015-01-10追記)
このことは等価なコードに書き換えても同様のようだ

エラーを回避するには、関数内の最初か最後でBに値を代入しておけばよいが、その良し悪しはその関数の仕様次第である。