Die SAS-Programmiersprache ist eine klobige, archaische Sprache aus dem Jahr 1966, die bis heute verwendet wird. Der ursprüngliche Compiler wurde in PL / I geschrieben , und ein Großteil der Syntax stammt aus PL / I. SAS hat auch eine Präprozessor-Makrosprache, die sich ebenfalls von der von PL / I ableitet . In dieser Herausforderung werden Sie einige einfache Elemente der SAS-Makrosprache interpretieren.
In der SAS-Makrosprache werden Makrovariablen mit dem %letSchlüsselwort definiert und das Drucken in das Protokoll erfolgt mit %put. Anweisungen enden mit Semikolons. Hier sind einige Beispiele:
%let x = 5;
%let cool_beans =Cool beans;
%let what123=46.lel"{)-++;
Bei Makrovariablennamen wird die Groß- und Kleinschreibung nicht beachtet. Sie stimmen immer mit dem regulären Ausdruck überein /[a-z_][a-z0-9_]*/i. Für die Zwecke dieser Herausforderung werden wir Folgendes sagen:
- Makrovariablen können nur Werte enthalten, die vollständig aus druckbaren ASCII-Zeichen bestehen der Ausnahme
;,&und% - Die Werte enthalten keine führenden oder nachfolgenden Leerzeichen
- Die Werte dürfen nicht länger als 255 Zeichen sein
- Werte können leer sein
- Klammern und Anführungszeichen in den Werten stimmen möglicherweise nicht überein
- Es kann eine beliebige Menge an Speicherplatz vor und nach der
=in der%letAnweisung und dieser Platz sollte ignoriert werden - Vor dem Terminal
;in der%letAnweisung darf beliebig viel Platz sein, und dieser Platz sollte ebenfalls ignoriert werden
Wenn eine Makrovariable aufgerufen wird, wird sie in ihren Wert "aufgelöst". Makrovariablen werden durch Voranstellen aufgelöst &. Es ist eine optionale hintere ., die das Ende des Bezeichners angibt. Beispielsweise,
%put The value of x is &X..;
Schreibt The value of x is 5.in das Protokoll. Beachten Sie, dass zwei Zeiträume erforderlich sind, da ein einziger Zeitraum von verbraucht wird &X.und in aufgelöst wird 5. Beachten Sie auch, dass, obwohl wir xin Kleinbuchstaben definiert haben , dies &Xdasselbe ist wie&x da bei Makrovariablennamen die Groß- und Kleinschreibung nicht berücksichtigt wird.
Hier wird es schwierig. Es &können mehrere s aneinander gereiht werden, um Variablen aufzulösen, und &s können gleichzeitig die gleiche Verschachtelungsauflösung haben. Beispielsweise,
%let i = 1;
%let coolbeans1 = broseph;
%let broseph = 5;
%put &&coolbeans&i; /* Prints broseph */
%put &&&coolbeans&i; /* Prints 5 */
Die innerste &Entschlossenheit zuerst, und die Entschlossenheit geht nach außen weiter. Der Abgleich von Variablennamen erfolgt gierig. In der zweiten %putAnweisung führt der Prozessor die folgenden Schritte aus:
&ibeschließt1, und die innerste Führung&wird verbraucht und gibt uns&&coolbeans1&coolbeans1beschließtbroseph, uns zu geben&broseph&brosephbeschließt zu5.
Wenn nachgestellte .s vorhanden sind , wird nur eine einzige .in der Auflösung verwendet, auch wenn mehrere vorhanden sind& s .
Aufgabe
Bei 1 bis 10 %letAnweisungen, die durch Zeilenumbrüche und eine einzelne Anweisung voneinander getrennt sind, können Sie %putdas Ergebnis der Anweisung ausdrucken oder zurückgeben%put Anweisung . Eingaben können auf jede übliche Art und Weise akzeptiert werden.
Sie können davon ausgehen, dass die Eingabe immer gültig ist und die %letAnweisungen der Anweisung vorausgehen %put. Definierte Variablen werden später nicht mehr neu definiert%let Anweisungen .
Wenn sie tatsächlich in SAS ausgeführt werden, gibt es keine Probleme mit Variablen, die in nicht vorhandene Variablen aufgelöst werden, und alles ist syntaktisch korrekt, wie oben beschrieben.
Beispiele
Eingang:
%let dude=stuff; %let stuff=bEaNs; %put &&dude..;Ausgabe:
bEaNs.Eingang:
%let __6 = 6__; %put __6&__6;Ausgabe:
__66__Eingang:
%let i=1; %let hOt1Dog = BUNS; %put &&HoT&i.Dog are FUNS&i!");Ausgabe:
BUNS are FUNS1!")Eingang:
%let x = {*':TT7d; %put SAS is weird.;Ausgabe:
SAS is weird.Eingang:
%let var1 = Hm?; %let var11 = var1; %let UNUSED = ; %put &&var11.....;Ausgabe:
Hm?....Beachten Sie, dass
&&var11Übereinstimmungen,var11da die Namensübereinstimmung gierig ist. Wenn es eine gewesen war., das heißt&&var1.1, dannvar1würde angepasst werden und die zusätzlichen 1 würde nicht Teil eines Namens sein.
Das ist Codegolf, also gewinnt die kürzeste Lösung in Bytes!
&&&&&&&&&a......................würde nach wie vor nur eine Periode entfernen?
&stuff.die Periode nicht entfernt werden?