2014-10-21 14 views
5

Używam makro wielokrotnie w SAS następująco:W SAS, wykonując makro bez średnika?

%mymac(a,b); 
%mymac(a,c); 
. 
%mymac(a,a) 
%mymac(a,w); 
. 

Mój program/makro jest podobny do:

/* begin program here */ 

data original_data; 
set mylib.mydata; 
run; 

%macro mymac(x,y); 

data mydata1; 
set original_data; 
where school_district="&x"; 
run; 

proc means data=mydata1; 
var income; 
run; 

%mend mymac; 

zdałem sobie sprawę, że zapomniał średnik (jak w (a, a)) i SAS nie przeszkadzało. Uruchomił wszystkie wywołania makr bez problemu. Porównałem dane wyjściowe, gdy dodałem średnik i nie widziałem różnicy.

Czy to normalne, że SAS nie podaje błędu z brakującym średnikiem?

+1

Więc jeśli rozumiem to wszystko poprawnie, nie potrzebuję średnika na końcu powyższego makra, ponieważ ostatnia instrukcja ma w sobie średnik, więc dodanie średnika do% mymac (a, a) w zasadzie być tym samym, co bieg literowy; na końcu wyciągu środków? – user27008

+1

Tak, to jest dokładnie poprawne. –

Odpowiedz

3

Zazwyczaj jest dobrze. Najważniejszą rzeczą, jaką należy zrozumieć w przypadku SAS Macro, jest to, że jest to narzędzie generujące kod, a nie prawdziwy język programowania. Podczas gdy %my_mac(x,y); wygląda jak tradycyjne wywołanie funkcji w języku podobnym do języka C, w którym chcesz zakończyć każdą instrukcję z ;, tutaj zakończenie ; nie ma prawdziwego znaczenia. Przeciwnie, jest to kod SAS, który jest generowany wewnątrz %my_mac(x,y), który robi. W twoim przypadku ten kod to gramatyczny SAS i jest w porządku. Jeśli mentalnie zastąpisz wywołanie %my_mac(x,y) generowanym przez siebie kodem (tj. data mydata.....run;), zobaczysz, że jest gramatyczny, nawet bez zakończenia %my_mac(x,y) z . Jeśli zamiast tego napisałbyś %my_mac(x,y);, wygenerowałbyś tylko data mydate.....run;;, co jest w porządku, ale ; jest zbędny.

W rzeczywistości pomijanie średnika jest również hack dla wartości zwracanej dla makra. Na przykład:

%MACRO x_plus_n (x = , y=); 
    %SYSEVALF (&x + &y) 
%MEND; 

%LET x = 3 ; 
%LET y = 4 ; 
%LET z = %x_plus_n (x = &x , y= &y) is the result; 
%PUT ------------- &z; 

Wskazówka brakujące ; na linii% SYSEVALF. Dzięki temu makro nie może się zakończyć do końca linii zaczynającej się %LET z = ...., gdzie znajduje się ;. Dane wyjściowe utworzone przez x_plus_n stają się rodzajem wartości zwracanej dla makra.

+0

Zasadniczo moje makro tworzy mój zestaw danych mydata1 za każdym razem, gdy jest wywoływany. Nie jestem najlepszy w makrach i nie jestem pewien, czy w pełni rozumiem twój przykład. – user27008

+3

@sparc_spread - Dodałem przykład bardziej znaczący, dodając tekst między wywołaniem makr a średnikiem. Bez dodatkowego tekstu, punkt, który próbujesz wprowadzić, nie jest tak oczywisty. –

+1

@RobertPenridge - Podoba mi się, dzięki! –

2

Makra to tylko zamienniki tekstu. Nie są to zazwyczaj same instrukcje wykonywalne (choć czasami mogą wykonywać polecenia przy użyciu %SYSFUNC). Jako taki, średnik nie jest wymagany po wywołaniu makra, chyba że byłby wymagany po tekście zawartym w makrze (i nie jest faktycznie zawarty w samym makrze).

IE:

%macro test; 
proc freq data=sashelp.class; 
run 
%mend test; 

musi być wykonany jako

%test; 

ponieważ run nie posiada terminala średnik. Jeśli wstawisz średnik po run do makra, możesz go uruchomić jako %test bez średnika.

Pamiętaj o pierwszym zdaniu: Makra to tylko zamienniki tekstu. Niezależnie od tego, jaki tekst zostanie wygenerowany przez makro, zostanie on wtłoczony do programu SAS i wykonany tak, jak gdybyś go napisał (może użyłeś %do i=1 %to 100; - tak że umieszcza 100 kopii tego, co jest w pętli - ale to tak, jakbyś sam wpisał wszystkie 100). W związku z tym zapotrzebowanie na ; zależy od tego, czy będzie potrzebne do wpisania.

4

Średniki to nie wymagane do wywołań makr.

Często są one uwzględniane, ponieważ ludzie widzą średniki jako sposób na "zakończenie instrukcji" lub zakończenie linii. Osobiście wolę je uwzględnić, gdy tylko jest to możliwe, ponieważ uważam, że mój kod jest bardziej czytelny.

Pamiętaj, że makra po prostu ocenić siebie i wrócić bez względu na to, że rozwiązania, do których może być blok kodu, który wygląda jak liczba, ciąg, czy cokolwiek innego ...

Weźmy ten przykład, gdzie nie średnik jest stosowany:

%macro field_list(); 
    name, 
    age, 
    sex, 
    height 
%mend; 

proc sql; 
    select %field_list() 
    from sashelp.class 
    ; 
quit; 

Spróbuj uruchomić go na swoim komputerze z option mprint; włączone. Wynik działania makra po prostu zwraca blok kodu wewnątrz niego. Prowadzi to do następującego kodu wykonywane:

proc sql; 
    select name, age, sex, height 
    from sashelp.class 
    ; 
quit; 

Gdybyśmy mieli średnik po wywołaniu naszej makro, to kod, który SAS by spróbować uruchomić obejmowałyby średnik, który byłby nieprawidłową składnię jak tak (uwaga średnik po wysokości):

proc sql; 
    select name, age, sex, height ; 
    from sashelp.class 
    ; 
quit; 

to dlatego, że średnik nie jest wymagane wywołanie makra, więc to po prostu staje w tyle i są wliczone w wykonaniu kroku.

Gdy wywołujesz makro w taki sam sposób, jak w powyższym przykładzie, to dobrze jest dołączyć średnik, ponieważ makro jest krokiem całkowicie autonomicznym. Iw otwartym kodzie nie ma nic złego posiadające obce średników tak:

%macro example2(inDS=, outDs=); 
    data &outDs; 
    set &inDs; 
    run; 
%mend; 

%example2(inDS=sashelp.class, outDs=tmp_class); 

Zasadniczo ocenia się:

data tmp_class; 
    set sashelp.class; 
run;; 

Uwaga dodatkowa średnik na końcu pozostały z naszej rozmowy? Mogliśmy mieć tyle, ile chcieliśmy i kod będzie nadal działać dobrze, to znaczy:

%example2(inDS=sashelp.class, outDs=tmp_class);;;;;; 

postanawia:

data tmp_class; 
    set sashelp.class; 
run;;;;;;; 

która nadal będzie działać dobrze, jak jest on ważny składnia.