V3のマクロ仕様について
マクロの使用法 (オリジナルのV3のマニュアルより適宜抜粋)
.DEFINE macro p1,p2,...,p255 { contents }
- macro: 文字列
- p1~p255: 文字列
- contents: 文字列
マクロ定義を行う。 ZMUSICには初めから備わっていないオリジナルのZMSコマンドを作成したり、 頻繁に登場する演奏パターンをコマンド化してZMSを見やすくしたりすることが出来る。
マクロ名はmacroで与え、 '{'を除く英数字、全角の240文字以内の文字列で与えることが出来る。 p1~p255はマクロに与えるパラメータで、 %でマクロに与えたいパラメータの個数だけ、記述する。 contentsはマクロの内容で、任意の文字列を与えることが出来る。 p1~p255で設定したパラメータを内容中に挿入したい時には%を添付する。 contentsの記述を複数行に分けることも可能。
例
.define DRUM1 %,%,%,% { c%d%c%d% }
%の後ろに数値を付けてパラメータの対応を判り易く記述することも出来るが、 その場合数値指定なしの記述とは混在出来ない。
例
.define DRUM1 %1,%2 { c%2d%1 } /OK
.define DRUM1 %1,%2 { c%1d% } /NG
なお、.DEFINE命令には以下のような制限事項がある。
- マクロ名に全角文字は全文字使えるが、 半角文字の場合は英字の大文字小文字の区別はない。
- ZMS中のありとあらゆるテキストがマクロ変換対象になる。
- マクロの変換対象となるソースは親ソースのみで、includeしたファイルや ADPCM定義ファイルなどのサブ・ファイルはマクロの変換対象にならない。
- マクロ内容にパラメータに相当しない%記号を用いられない。 たとえば
- .define ABC %,%,% {c%d%e%001}
- としたとき最後の%001は2進数値とみなされずにマクロパラメータ識別子%と 10進数の'001'としてみなされる。
- .DEFINE文で与えたパラメータの数と マクロ内容で参照するパラメータの数は 必ず同一でなければならない。たとえば次の例はエラーとなる。
- .define ABC %,%,% {c%d%e}
- ただし、使用する時は与えるパラメータが少なくても構わない。 足りないパラメータに付いてはなにも与えないで処理される。 たとえば上のような定義のもとで
- ABC 1,2
- とすると
- c1d2e
- として処理される。
やぎ補足(断りのない限りV3/zmc2共通)
- %の後に数字をつけて分かりやすくする場合、 p1...p255の数値の順序や指定法はどうでもよい(数字の有無のみチェックする)。 よって下記の2つの定義例は内部的にはまったく同じ。
- .define ABC %1,%2,%3 {c%1d%2e%3} /OK
- .define ABC %3,%7,%5 {c%1d%2e%3} /OK
- しかしcontentsでの数値は、1より始まって1ずつ増えていく数値のみ 指定可能。それ以外ではエラーとなる。
- .define ABC %1,%3,%5 {c%1d%3e%5} /NG
- .define ABC %2,%3,%4 {c%2d%3e%4} /NG
- これらを守っている場合、contents部でパラメータの順番を入れ替える ことはできる。この場合、1番目のパラメータはcontents部の%1で指定 された場所に、2番目のパラメータは%2で指定された場所に...といった 具合に用いられる。
- .define ABC %1,%2,%3 {c%3d%1e%2} /OK → ABC 1,2,3 は c3d1e2 となる
- .define ABC %3,%1,%2 {c%3d%1e%2} /OK → ABC 1,2,3 は c3d1e2 となる (c1d2e3とはならない)
- .define ABC %1,%2,%3 {c%1d%2e%2} /OK → ABC 1,2,3 は c1d2e2 となる
- .define ABC %1,%2,%3 {c%1d%2e%2f%3} /OK → ABC 1,2,3 は c1d2e2f3 となる
- .define ABC %,%,% {c%d%e%f%} /NG → contents部パラメータが多すぎる (オリジナルの説明の5.参照)
- 定義行と違って、マクロ実行行は複数行に分けて記述することはできない。
- zmc2では以下の制限や制限解除がある;
- macro名の長さ、p1,...の引数の数、contents部の文字列長 すべて制限なし
- p1,p2,...の部分をまるまる省略可能
- 例: .define [ABC] {c%1d%3e%2} /OK (zmc2 only)
- UNIX版ではマクロ名に漢字が使えない
- contents部に改行があった場合、 マクロ展開時に改行ならびにマクロ内の注釈(/以下)も削除される (実害はないはず)
- 置換されるマクロ名の候補は最長一致で決定される (オリジナルのアルゴリズムは不明)
- →現在、マクロ名の中に別のマクロ名があると誤動作するため、 無意味といえば無意味。