■マクロ定義命令 MACRO[ ]
マクロを定義します。
この命令は、「macro.yst」ファイル内でのみ使用できます。
YU-RIS のマクロは基本的に「置換処理をするマクロ」ですが、
パラメータを利用することにより「疑似関数マクロ」として使うことも出来ます。
キーワード
NAME〜NAME8 = 文字列 | 定義するマクロ名を記述 ※名前を複数定義する際はNAME2以降を使用 |
STR = 文字列 | マクロが実行された時に置換される文字列を記述 |
DEF〜DEF10 = 文字列 | パラメータが省略された場合にデフォルトで格納される文字列 |
[1] 「\ABC」という名前のマクロを定義します。
このマクロがスクリプト上で記述されると、その場所は「テスト」という文字列に置換されます。
MACRO[ NAME=ABC STR="テスト" ]
例えば上のように定義して、スクリプト上の任意の場所に、
あいう\ABCえお。
という記述をすると、実際にはスクリプトに
あいうテストえお。
と記述したのと同じことになります。
文字通り、マクロを指定した文字列に『置き換える』わけです。
これが YU-RIS での基本的なマクロの機能になります。
[2] 「\ABC」という名前のマクロを定義します。
このマクロがスクリプト上でパラメータ付きで記述されると、$_M , $_M2 の部分が
そのパラメータ文字列に変換されてから、置換されます。
MACRO[ NAME=ABC STR="GOSUB[#=SUB1 PINT=$_M PINT2=$_M2]" ]
例えば上のように定義しておいて、
\ABC(50,100)
上のようにマクロを記述すると、それぞれ $_M → 50 に、$_M2 → 100 に変換され、
GOSUB[#=SUB1 PINT=50 PINT2=100]
と、置換されることになり、結果的に \ABC マクロは、
『ラベルSUB1 へGOSUBジャンプし、パラメータとして 50 と 100 の値を渡す』働きを持つ命令となります。
※パラメータ受け渡しの仕組みに関しては [制御系命令] → [GOSUB〜RETURN] の項目をご覧ください。
同様に、
MACRO[ NAME=ABC STR="GOSUB[#=SUB1 PSTR=$_M PFLT2=$_M2]" ]
と定義して、
\ABC("あいう",1.23)
と記述すれば、
GOSUB[#=SUB1 PSTR="あいう" PFLT2=1.23]
と、置換されます。
マクロのパラメータは、記述を省略することができます。
MACRO[ NAME=ABC STR="GOSUB[#=SUB1 PINT=$_M PINT2=$_M2 PINT3=$_M3]" ]
例えば、上のようにマクロ定義し、そのうえで
\ABC(10, 20, 30)
通常はこのように使用しているとき、
\ABC(10, 20)
と、パラメータを省略して書くことも出来ます。(この場合は第3パラメータを省略)
ただ上の例の場合、実際に置換されると下のようになります。
GOSUB[#=SUB1 PINT=10 PINT2=20 PINT3=]
PINT3 の部分を見てください。
第3パラメータが省略されたので、$_M3 には何も格納されず、
上のように置換されてしまい、結果として正しくない文法になりコンパイルエラーとなってしまいます。
その対策(マクロのパラメータを省略しても問題なくするための方法)として、
DEF〜DEF8 キーワードを使用します。このキーワードにより、
『パラメータが省略された際、$_M〜$_M8 にデフォルトで格納される文字列を設定する』ことができます。
MACRO[ NAME=ABC STR="GOSUB[#=SUB1 PINT=$_M PINT2=$_M2 PINT3=$_M3]" DEF3="0" ]
このようにマクロ定義することで、
第3パラメータが省略された場合に、$_M3 には 0 という文字列が格納されるようになります。
ですので、さきほどと同様に
\ABC(10, 20)
このように書いた場合、
GOSUB[#=SUB1 PINT=10 PINT2=20 PINT3=0]
第3パラメータが省略されたため、DEF3 によって設定されたデフォルト文字列「0」が$_M3に格納されることになり、
上のように文法として正しくなるので、コンパイルが通るようになります。
補足として、パラメータ省略の記述仕様ですが、
\ABC(,20)
や、
\ABC(,20,)
などと記述することもでき、この場合、第1,第3パラメータを省略した事になります。
また、
\ABC(,,,)
\ABC(,,)
\ABC(,)
\ABC
と記述することもでき、この場合、全てのパラメータを省略した事になります。
[3] 「\ABC」「\DEF」「\GHI」という名前のマクロを定義します。(※マクロの中身は全て同じ)
MACRO[ NAME=ABC NAME2=DEF NAME3=GHI STR="テスト" ]
上のように定義した場合、
MACRO[ NAME=ABC STR="テスト" ]
MACRO[ NAME=DEF STR="テスト" ]
MACRO[ NAME=GHI STR="テスト" ]
と定義したのと同じことになります。
|