[トップ][編集][ノート][編集履歴][一覧][最近の更新][->English]

マクロ内に複数行のパラメータを送りたい

以前りすとはそんな要望にチャチャ入れてかなりヤられちゃった過去もあるんですけど(あん時はかなり凹んだ)HSPの命令/関数は値と変数しか渡せません。でもマクロってコードもラベルも渡せます。コードも渡せるってことは、コードをいっぱい渡したいですよね。そんな時はどうしたらいいでしょうか?マクロで文字列(値じゃないですよ。コードの断片です)をスタックへの出し入れができます。そんなわけで複数のコードの断片をマクロを介して渡してみました。

#define ctype push(%1) %tpop_push %s1

#define ctype push_1(%1):\
push(%1):push(/**/):push(/**/):push(/**/)
#define ctype push_2(%1,%2):\
push(%1):push(%2):push(/**/):push(/**/)
#define ctype push_3(%1,%2,%3):\
push(%1):push(%2):push(%3):push(/**/)
#define ctype push_4(%1,%2,%3,%4):\
push(%1):push(%2):push(%3):push(%4)

#define pop4 %tpop_push  %o:%o:%o:%o

#define ctype コードを送ったラベル(%1)*%1:pop4:pop4:return

push_4(mes a,a++,a++,a++)
push_2(a++,a=0)
gosub *code
stop

コードを送ったラベル(code)

上のスクリプトではスタックへコメントを挿入することで無理矢理4個づつ詰め込んでますけど、何個かづつ挿入するのはマクロを書くのがめんどくさいです。そんなわけで1個づつ代入してみます。

#define ctype push(%1) %tpop_push %s1

#define 空_push_4:push(/**/):push(/**/):push(/**/):push(/**/)

#define 展開無しpop4 %tpop_push  %p0:%p1:%p2:%p3

#define pop  %tpop_push  %o
#define pop4 %tpop_push  %o:%o:%o:%o:

#define ctype コードを送ったラベル(%1)*%1:展開無しpop4:return

空_push_4
push(mes a)
push(a="abc")
gosub *code
stop

コードを送ったラベル(code)

*pop用ラベル
        pop
        pop
        pop4
        return

複数行渡しの例として、elseifの実現と配列に数字をいっぱい渡して代入するというのがありました。elseifは探したらベクターにありました。