SASプログラミング言語は、まだ使用中今日の1966年に不格好、古風な言語デートバックです。元のコンパイラはPL / Iで記述されており、実際、構文の多くはPL / Iから派生しています。SASには、PL / Iの言語から派生したプリプロセッサマクロ言語もあります。この課題では、SASマクロ言語のいくつかの単純な要素を解釈します。
SASマクロ言語では、%let
キーワードを使用してマクロ変数が定義され、ログへの出力はで行われ%put
ます。ステートメントはセミコロンで終わります。ここではいくつかの例を示します。
%let x = 5;
%let cool_beans =Cool beans;
%let what123=46.lel"{)-++;
マクロ変数名は大文字と小文字を区別せず、常に正規表現と一致します/[a-z_][a-z0-9_]*/i
。この課題のために、次のように言います。
- マクロ変数は、印字可能なASCII文字のみで完全に成るの値を保持することができます以外に
;
、&
と%
- 値に先頭または末尾のスペースはありません
- 値は255文字を超えることはありません
- 値は空かもしれません
- 値の中の括弧と引用符は一致しない場合があります
- そこの前後にスペースの任意の量であることができる
=
で%let
声明と、このスペースは無視されるべきです - ステートメント
;
内の端末の前に任意の量のスペースがあり%let
、このスペースも同様に無視する必要があります
マクロ変数が呼び出されるとき、その値に「解決」すると言います。マクロ変数は、先頭に付加することで解決され&
ます。識別子の終わりを示すオプションの末尾があり.
ます。例えば、
%put The value of x is &X..;
The value of x is 5.
ログに書き込みます。1つの期間がに消費され&X.
、解決されるため、2つの期間が必要であることに注意してください5
。またx
、小文字で定義したにもかかわらず、マクロ変数名では大文字と小文字が区別されないため&X
、同じ&x
です。
ここで注意が必要です。複数&
のを一緒に連結して変数を解決&
し、同じレベルのネストを同時に解決できます。例えば、
%let i = 1;
%let coolbeans1 = broseph;
%let broseph = 5;
%put &&coolbeans&i; /* Prints broseph */
%put &&&coolbeans&i; /* Prints 5 */
最も内側&
のが最初に解決され、解像度は外側に向かって続きます。変数名のマッチングは貪欲に行われます。2番目の%put
ステートメントでは、プロセッサは次の手順を実行します。
&i
に解決し1
、最も内側のリード&
が消費されて、&&coolbeans1
&coolbeans1
に解決しbroseph
、私たちに与えます&broseph
&broseph
に解決され5
ます。
末尾に.
s がある場合.
、解像度が複数ある場合でも、1つだけが解像度で消費されます&
のです。
仕事
%let
改行と単一の%put
ステートメントで区切られた1〜10個のステートメントを指定すると、%put
ます。入力は任意の標準的な方法で受け入れることができます。
入力は常に有効であり、%let
ステートメントはステートメントの前にあると想定でき%put
ます。定義された変数は、後の%let
ステートメントで再定義されません。
実際にSASで実行する場合、存在しない変数に解決する変数に問題はなく、上記のようにすべてが構文的に正しいでしょう。
例
入力:
%let dude=stuff; %let stuff=bEaNs; %put &&dude..;
出力:
bEaNs.
入力:
%let __6 = 6__; %put __6&__6;
出力:
__66__
入力:
%let i=1; %let hOt1Dog = BUNS; %put &&HoT&i.Dog are FUNS&i!");
出力:
BUNS are FUNS1!")
入力:
%let x = {*':TT7d; %put SAS is weird.;
出力:
SAS is weird.
入力:
%let var1 = Hm?; %let var11 = var1; %let UNUSED = ; %put &&var11.....;
出力:
Hm?....
注
&&var11
一致するvar11
名前の一致は貪欲であることから。があった場合.
、つまり&&var1.1
、var1
一致し、余分な1は名前の一部にはなりません。
これはコードゴルフであるため、バイト単位の最短ソリューションが勝ちです!
&&&&&&&&&a......................
、まだ一つだけの期間を削除しますか?
&stuff.
期間を削除すべきではありませんか?