Semikolons sind nicht erforderlich für Makroaufrufe.
Oft sind sie enthalten, da Leute Semikolons als eine Möglichkeit zum "Beenden der Anweisung" oder zum Beenden der Zeile gewohnt sind. Ich persönlich bevorzuge es, sie wenn möglich einzuschließen, da ich glaube, dass es meinen Code lesbarer macht.
Denken Sie daran, dass Makros sich einfach auswerten und zurückgeben, was auch immer es ist, dass sie zu lösen, an dem ein Block von Code sein könnte, der wie eine Zahl aussieht, eine Zeichenfolge, oder irgendetwas anderes ...
Nehmen Sie dieses Beispiel, wo keine Semikolon verwendet:
%macro field_list();
name,
age,
sex,
height
%mend;
proc sql;
select %field_list()
from sashelp.class
;
quit;
Probieren sie es auf Ihrem eigenen Rechner mit option mprint;
aktiviert ausgeführt wird. Das Ergebnis der Ausführung des Makros gibt einfach den darin enthaltenen Code-Block zurück. Dies führt zu dem folgenden Code wird ausgeführt:
proc sql;
select name, age, sex, height
from sashelp.class
;
quit;
Wenn wir ein Semikolon nach dem Aufruf unserer Makro, hatte dann den Code, der SAS versuchen würde, das Semikolon zu laufen würde, die ungültige Syntax wie so (Anmerkung wäre das Semikolon nach Höhe):
proc sql;
select name, age, sex, height ;
from sashelp.class
;
quit;
Dies liegt daran, das Semikolon nicht für den Aufruf von Makros erforderlich ist, so es wird in der Ausführung des Schrittes hinter und enthielt nur links.
Wenn Sie ein Makro wie im obigen Beispiel aufrufen, ist es gut, das Semikolon einzufügen, da Ihr Makro ein vollständig eigenständiger Schritt ist. Und in Open Source gibt es keinen Schaden wie so fremd Semikolons mit:
%macro example2(inDS=, outDs=);
data &outDs;
set &inDs;
run;
%mend;
%example2(inDS=sashelp.class, outDs=tmp_class);
Dies wertet im Wesentlichen auf:
data tmp_class;
set sashelp.class;
run;;
Hinweis das zusätzliche Semikolon am Ende von unserem Anruf übrig? Wir konnten so viele wie wir und der Code wollten läuft immer noch gut, das heißt:
%example2(inDS=sashelp.class, outDs=tmp_class);;;;;;
Beheben zu:
data tmp_class;
set sashelp.class;
run;;;;;;;
die noch gut laufen wird, da es gültige Syntax ist.
Also wenn ich das alles richtig verstehe, brauche ich kein Semikolon am Ende des obigen Makros, weil die allerletzte Anweisung ein Semikolon enthält, also würde ein Semikolon zu% mymac (a, a) hinzugefügt werden im Wesentlichen ist das gleiche wie Tippen ausführen ;; am Ende der Mittelanweisung? – user27008
Ja, das ist genau richtig. –