【SAS】マクロで戸惑ったこと

SASでマクロを書いたときに、戸惑った覚えがあることを残しておきます。
どうでも良いですがSASでマクロを書くと、(書いたこと無いけど)COBOLとかの昔からある言語はこんな感じかなぁと思ってしまいます。

PUT、INPUT関数

これを%SYSFUNCの中で書いたら、怒られてびっくりしました。
マクロの中ではPUTN、INPUTN関数を使わないといけないです。
他にも、%SYSFUNCで使えない関数は、こんなにあります。

  • ALLCOMB
  • ALLPERM
  • DIF
  • DIM
  • HBOUND
  • IORCMSG
  • INPUT
  • LAG
  • LBOUND
  • LEXCOMB
  • LEXCOMBI
  • LEXPERK
  • LEXPERM
  • MISSING
  • PUT
  • RESOLVE
  • SYMGET

SAS(R) 9.2 Macro Language: Reference

INTNX関数

今日から1ヶ月後の日付を計算してマクロ変数に格納したいということがあると思います。
このときにINTNX関数を使うのですが、この関数の第1引数でものすごくはまった記憶があります。
たとえば、今日から1ヶ月先の日付を取得したい場合、マクロ以外では

INTNX('MONTH', TODAY(), 1)

と第1引数にクオテーション付きで時間間隔を指定する引数を与えますが、マクロでは

%SYSFUNC(INTNX(MONTH, %SYSFUNC(TODAY()), 1))

と第1引数にクオテーションは不要となります。
Technical Support:nヶ月先の同日日付を取得する方法(SAS 9.1以降)