HyqerTalkの注意事項 その2
関数定義上の制限
関数の中でrepeat文は使わないでください。
使えないというより正しく動作しません。かなりダメな仕様ですみません。
同一オブジェクト内に関数とハンドラを同じ名前で作らないでください。
on abc
play flute c d e
end abc
function abc
return pi
end abc
手抜き仕様で作成したため、上記のように定義すると、先に定義したものが後で定義したものに上書きされてしまいます。
関数使用上の注意
関数の引数に関数を入れたり、()を使ったりできません。
HyqerTalkの致命的な設計ミスにより上記のことができません。
例えば、下記のような場合
put max( random( 10 ) , ( 5 + 1 ) ) into hensu
以下のようにしてください。
put random( 10 ) into hensu1
put (5 + 1 ) into hensu2
put max( hensu1 , hensu2 ) into hensu
関数名の後ろの括弧の前にスペースは入れないで下さい。
put random ( 10 ) into hensu ← 失敗します
put random( 10 ) into hensu ← うまくいきます
仕様を勘違いしていて関数名と括弧の間にスペースを入れてはいけないと思っていました。このあたりは弄ると他に影響が出そうなので直しません。
2017/6/26追記
複数引数がある場合はフィールドなどのオブジェクトを引数に指定しないでください
ちょっと条件が複雑ですがmaxやminなどのように引数を複数とる場合は、フィールドやボタン(殆どそういう使い方はしないと思いますが)を指定するとエラーが出ます。
以下のように引数が一つであれば大丈夫ですが、
put random( cd fld 1 ) into hensu
以下のように引数が複数ある場合はエラーが出ます。
put max( 5 , cd fld 1 ) into hensu
こういう場合は以下のようにして下さい。
put cd fld 1 into hensu1
put max( 5 , hensu1 ) into hensu
条件を覚えるのは面倒ですから、関数の引数は文字列、数値、変数のいずれかと考えておくと良いかもしれません。
2017/6/27追記
関数内でparams、param、paramcountの関数は正しい値を返しません
以下のような関数に出くわしたのですが、正しく動きませんでした。
function funcTest arg
put paramcount() into hensu
put random( heusu ) into hensu2
put param( hensu2 ) into hensu3
return hensu
end funcTest
上位ハンドラでの値を返してしまします。