マクロ変数のスコープに関連する問題を解決しようとしているときに、この非常に役立つSOページが見つかりました。 why doesn't %let create a local macro variable?SASマクロ変数がローカルスコープでないのはなぜですか?
だから、マクロ意志で%let x = [];
または%do x = [] %to [];
を書いて、要約する:なし「x」はグローバルシンボルテーブルに既に存在しない場合、ローカル・スコープマクロ変数xを作成
- 、または
- "x"がグローバルシンボルテーブルにある場合は、グローバルスコープマクロ変数 "x"を更新してください。
これは非常に非直感的です。 SASの荒野にはこのデザインの選択肢のためにたくさんのバグがあることを喜んで賭けています。 "i"や "counter"のような一般的な変数名を使ったループ文の上でさえ、マクロ内の%local文をめったに見ることはほとんどありません。たとえば、SUGIとSAS Global Forumの論文リストのタイトルに「マクロ」と書かれた最初の論文を取り上げたばかりです http://www.lexjansen.com/cgi-bin/xsl_transform.php?x=sgf2015&c=sugi
そして、私が開いた最初のSAS会議の論文でこのコードが見つかりました:
%macro flag;
data CLAIMS;
set CLAIMS;
%do j= 1 %to 3;
if icd9px&j in (&codelist)
then _prostate=1;
%end;
run;
%mend;
%flag;
http://support.sas.com/resources/papers/proceedings15/1340-2015.pdf
%フラグを呼び出し、また、独自の& j変数を持っている人がたに災い。彼らは容易にログエラーではなく、彼らの& jがどこからでも%flagを呼び出した後であるため、偽の結果に終わることがあります。あるいは悪いことに、彼らは結果が偽であることを決して認識しないかもしれません。
私の質問は、マクロ変数をすべてデフォルトでローカルスコープにしないようにしたのはなぜですか? SASマクロ変数の有効範囲がそのように機能する理由はありますか?
これは興味深い質問ですが、s.oのトピックであるかもしれません。正解があるかもしれないので、意見に近いです。 communities.sas.comまたはSAS-Lに質問することを提案するには、より多くの議論が必要です。つまり、スコープルールは直感的ではなく、野生のバグを引き起こす可能性が高いことに私は同意します。 – Quentin
クエンティンの提案に感謝します。 "language-design"タグの説明と、このタグについてここで参照している質問のタイプに基づいて、私はこの質問がSOの話題とはならないとは思わなかった。たぶん私はあなたが同様に言及したサイトの1つにこれを投稿します。 –
言語デザインのタグに関する良い点は、これらの質問の多くが話題外であったと思い込んでいたと思います。 (私がそれがOTだと思ったとしても、私はまだ答えを書くつもりでした): – Quentin