投稿

9月, 2017の投稿を表示しています

マクロの引数にカンマ、クォートなどを渡す : %bquote, %str, %superq - SAS

%bquote , %str などを用いて、マクロの引数に、カンマ、クォートといった記号を渡す方法です。何度か質問されたので、まとめてみます。 まずはサンプル用のマクロとして、マクロの引数に渡った値をログに出力するだけの単純なマクロを作ります。 %macro TEST(ARGS) ; %put &=ARGS. ; %mend TEST ; まずは失敗例。下記のように、カンマやダブルクォーテーションを引数として渡そうとしてみます。しかし、カンマを付けてしまうと、"1"が 1つ目の引数の値、"2"が 2つ目の引数の値としてみなされてしまいます。マクロ定義の引数より多く引数を渡したと言われ、ERROR になってしまいます。 実行ログ 67 %TEST("1", "2") ; ERROR: マクロに定義された数よりも多い定位置パラメータが与えられています。 68 カンマやダブルクォーテーションを渡すためには、%bquote あるいは %str を使うことで、渡すことができます。 %str は、ダブルクォーテーションの前に % を書かないといけないので、少々面倒ですね。 実行ログ 69 %TEST(%bquote("1", "2")) ; ARGS="1", "2" 70 71 %TEST(%str(%"1%", %"2%")) ; ARGS="1", "2" また、引数をマクロ変数にて、渡したい場合は %bquote を使うことでできます。%str だと渡すことができません。 実行ログ 61 %let ARGS = "1", "2" ; 62 %TEST(%bquote(&ARGS.)) ; ARGS="1", "2" 63