例として、ユーザーが問題と質問を入力し、それらを別のマクロによって後で印刷できるオンライントレーニングシステムを作成することを考えます。%WINDOWステートメントへのユーザーの入力は、ローカルマクロ変数に割り当てられてからグローバルマクロ変数に割り当てられます。ユーザーは、マクロに関して質問するため、問題の例に従うすべての種類のマクロ変数参照およびマクロ呼び出しだけでなく、マークが付いていない不一致の引用符およびかっこを入力する可能性があります。%BQUOTEを使用して入力をマスクした場合は、いくつかの%PUTステートメントを使用して、問題を引き起こす入力についてユーザーに警告しています。%SUPERQ関数を使用すれば、より少ない指示ですみます。マクロASK1とASk2は、マクロクォーティング関数を変更すると、マクロコードがどのように単純化されるかを示しています。
次のマクロASK1に、%BQUOTE関数を使用した場合のマクロコードを示します。
%window ask
#5 @5 'Describe the problem.'
#6 @5 'Do not use macro language keywords, macro calls,'
#7 @5 'or macro variable references.'
#9 @5 'Enter /// when you are finished.'
#11 @5 val 100 attr=underline;
%macro ask1;
%global myprob;
%local temp;
%do %until(%bquote(&val) eq %str(///));
%display ask;
%let temp=&temp %bquote(&val);
%end;
%let myprob=&temp
%mend ask1;
マクロASK1には、一致しない引用符およびかっこに関する警告が含まれていません。次のようにマクロASK1を呼び出し、問題を入力できます。
%ask1
Try entering:
Why did my macro not run when I called it? (It had three
parameters, but I wasn't using any of them.)
It ran after I submitted the next statement.
///
入力の1行目と2行目の両方に、マークが付いていない不一致の引用符とかっこが含まれていることに注目してください。%%BQUOTEは、実行中にこれらの文字を処理できます。
次に示すマクロASK2は、%SUPERQ関数を使用してASK1に変更を加えたものです。ここでは、%WINDOWステートメントはマクロ言語キーワードを受入れ、マクロ呼び出しおよびマクロ変数参照の置換を試みません。
%window ask
#5 @5 'Describe the problem.'
#7 @5 'Enter /// when you are finished.'
#9 @5 val 100 attr=underline;
%macro ask2;
%global myprob;
%local temp;
%do %until(%superq(val) eq %str(///)); /* No ampersand */
%display ask;
%let temp=&temp %superq(val); /* No ampersand */
%end;
%let myprob=&temp
%mend ask2;
次のようにマクロASK2を呼び出して、入力できます。
%ask2
Try entering:
My macro ADDRESS starts with %MACRO ADDRESS(COMPANY,
CITY);. I called it with %ADDRESS(SMITH-JONES, INC., BOSTON),
but it said I had too many parameters. What happened?
///
この入力には、マクロ言語キーワード、マクロ呼び出し、および一致しないかっこが含まれています。