chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

SASのマクロを勉強する(そもそもワケが分からない)

背景:子供からSASをやる必要があると相談を受ける(特にマクロ定義)。SASはクセ強言語でワケが分からない*1
取り組み:SAS言語処理系は普通には買えないので、無料で使える、SAS Studioでmacroを少し勉強
結論:SASのmacroはSASソースコードが実行される前にテキストベースでソースコードに対して置換が行われる(SASのTutorialではコンパイルと書かれている)。置換された新しいソースコードSASのコードとして実行されると理解。だから、Pythonのdef(関数定義)と誤解すると大いにハマる。Lispのmacroと同じと思えばいいのではないかと*2

以下はテストコード

%putを使う必要はないけど、デバッグ用に利用

■追記
上記の理解だと、Cコンパイラのpre processorのように書いているが、よく考えると、SASプログラム実行に応じてmacroが呼ばれたり呼ばれなかったり、さらに、引数付きのmacroは引数に応じて処理が変わるので、マクロが実行された後、SASプログラムが実行されるような解釈は間違っていて、SAS本体プログラムの実行に合わせてmacroによる置換?がその都度実行されていると理解すべき。だからやっぱりLispのmacroから類推して理解すべきだと。

■追記
マクロはテキストベースの処理なんだと確認するため、まったく何の助けにならない代入だけのマクロを試作

実行結果は以下の通り、新しい列(hello)が作成され、値が25になっている。

もしSASのマクロが関数のようなものだったら、myassignの引数としてhelloと指定した段階で、そんな変数知らんと言ってエラーになるだろう。

■参考資料
以下は厳密な定義なので、読んでも理解できない
マクロの定義および呼び出し
SASのmacro tutorial
マクロ変数を使用した文字列の置換
無料で使えるSAS実行環境
SAS Studio | SAS

*1:最初の製品版リリースが1976年らしい。COBOLは1959年、Fortranは1957年らしいので、古典的プログラミング言語からは新しい言語かと

*2:だから最初からマクロといってるじゃないですか!とSAS処理系から言われそうだ