V3のマクロ仕様について

マクロの使用法 (オリジナルのV3のマニュアルより適宜抜粋)

.DEFINE macro p1,p2,...,p255 { contents }

    • macro: 文字列
    • p1p255: 文字列
    • contents: 文字列

マクロ定義を行う。 ZMUSICには初めから備わっていないオリジナルのZMSコマンドを作成したり、 頻繁に登場する演奏パターンをコマンド化してZMSを見やすくしたりすることが出来る。

マクロ名はmacroで与え、 '{'を除く英数字、全角の240文字以内の文字列で与えることが出来る。 p1p255はマクロに与えるパラメータで、 %でマクロに与えたいパラメータの個数だけ、記述する。 contentsはマクロの内容で、任意の文字列を与えることが出来る。 p1p255で設定したパラメータを内容中に挿入したい時には%を添付する。 contentsの記述を複数行に分けることも可能。

.define DRUM1 %,%,%,% { c%d%c%d% }

%の後ろに数値を付けてパラメータの対応を判り易く記述することも出来るが、 その場合数値指定なしの記述とは混在出来ない。

.define DRUM1 %1,%2 { c%2d%1 } /OK

.define DRUM1 %1,%2 { c%1d% } /NG

なお、.DEFINE命令には以下のような制限事項がある。

    1. マクロ名に全角文字は全文字使えるが、 半角文字の場合は英字の大文字小文字の区別はない。
    2. ZMS中のありとあらゆるテキストがマクロ変換対象になる。
    3. マクロの変換対象となるソースは親ソースのみで、includeしたファイルや ADPCM定義ファイルなどのサブ・ファイルはマクロの変換対象にならない。
    4. マクロ内容にパラメータに相当しない%記号を用いられない。 たとえば
      1. .define ABC %,%,% {c%d%e%001}
    5. としたとき最後の%001は2進数値とみなされずにマクロパラメータ識別子%と 10進数の'001'としてみなされる。
    6. .DEFINE文で与えたパラメータの数と マクロ内容で参照するパラメータの数は 必ず同一でなければならない。たとえば次の例はエラーとなる。
      1. .define ABC %,%,% {c%d%e}
    7. ただし、使用する時は与えるパラメータが少なくても構わない。 足りないパラメータに付いてはなにも与えないで処理される。 たとえば上のような定義のもとで
      1. ABC 1,2
    8. とすると
      1. c1d2e
    9. として処理される。

やぎ補足(断りのない限り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部に改行があった場合、 マクロ展開時に改行ならびにマクロ内の注釈(/以下)も削除される (実害はないはず)
        • 置換されるマクロ名の候補は最長一致で決定される (オリジナルのアルゴリズムは不明)
        • →現在、マクロ名の中に別のマクロ名があると誤動作するため、 無意味といえば無意味。

[mml解説にもどる]