プチコン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に値を代入しておけばよいが、その良し悪しはその関数の仕様次第である。