では、数値が与えられた場合はそれを2倍した値を返し、文字列ならばnanを返すようにしてみましょう。
そのためには引数の変数が数値か文字列かを判断しなくてはなりません。それには私の自作関数SUFFIXを用いると簡単です。
自作関数 SUFFIX()
https://miiverse.nintendo.net/posts/AYMHAAADAAB2V0fSfxRUkA
DEF X2(A)
IF SUFFIX(A) THEN
A=A*2
ELSE
A="nan"
ENDIF
RETURN A
END
このようにSUFFIXを使えば与えられた型によって動作が変わる自作関数を作ることが容易にできます。
これはOUTを使った場合にも注意しなくてはなりません。
例えばAの値が正数の時に2倍した値を返し、負数の時は0を返す関数X2を下記のように記述したとします。
DEF X2 A OUT B
IF A>0 THEN B=A*2
END
この関数ではAの値が0以下の場合は戻り値Bには代入されないためBの型が決定できずエラーとなってしまいます。
そこで下記のようにしました。
DEF X2 A OUT B
B=0
IF A>0 THEN B=A*2
END
では、上記の自作関数X2を正数の場合は1.5倍、負数の場合はそのままの値を整数型で返すという場合にはどうなるかを考えてみましょう。(例えばX2(3.6)ならば3.6を整数値にした3を1.5倍にして得られた4.5をさらに整数にした4を返すという感じ)
DEF X2 A OUT B
B=FLOOR(A)
IF A>0 THEN B=B*1.5
END
これでBの初期値はAを整数にした値、Aが正数ならばその値を1.5倍になっているので想定しているような動作になりそうですが、X2 3.6 OUT Bとしてみると変数Bの値は4.5になります。
これはFLOORでは整数型ではなく単なる整数値であるためです。
分かりやすく言えばA%=3.6においてA%は3という整数型の値になりますが、A#=FLOOR(3.6)においてA#は3という実数型の値(3.0と同じ値)になっているのと同じ状態なのです。
この場合だと下記のように記述すると想定しているような動作になります。
DEF X2 A OUT B
B=A>>0
IF A>0 THEN B=B*1.5
END
シフト演算、ビット演算は値を整数値で返すだけではなく整数型として返すので覚えておくと良いでしょう。(A>>0、A<<0、0 OR A、-1 AND A、NOT-A+1、A DIV 1はすべて同じく値を実数型から整数型へと変換できる)
FLOOR(A)とA>>0はAの値が正数であれば両者は全く同一と思われがちですが、同じ整数値であってもFLOOR(A)は実数型、A>>0は整数型であるため覚えておくとよいかもしれません。
もちろん、こんな知識がなくても上記の「0.0ではなく0を代入したら整数型になる」ということさえ知っていれば下記のように記述することもできます。
DEF X2 A OUT B
B=0
B=A
IF A>0 THEN B=B*1.5
END
Bに0を代入した時点でBは整数型の変数になり、それで型が決定されるためB=AとしてAを代入したらBにはAを整数値に丸めた値が入り、B=B*1.5も整数値に丸めらた値が変数Bに入ります。