SAS programlama dili bugün hâlâ kullanılıyor bulunuyor 1966 aksak, arkaik dil partner geri döndü. Orijinal derleyici PL / I'de yazılmıştır ve aslında sözdiziminin çoğu PL / I'den türemiştir. SAS ayrıca PL / I dilinden türeyen bir önişlemci makro diline sahiptir . Bu zorlukta, SAS makro dilinin bazı basit öğelerini yorumlayacaksınız.
SAS makro dilinde, makro değişkenler %let
anahtar sözcük kullanılarak tanımlanır ve günlüğe yazdırma ile yapılır %put
. İfadeler noktalı virgülle biter. İşte bazı örnekler:
%let x = 5;
%let cool_beans =Cool beans;
%let what123=46.lel"{)-++;
Makro değişken adları büyük / küçük harfe duyarsızdır ve her zaman normal ifadeyle eşleşir /[a-z_][a-z0-9_]*/i
. Bu zorluğun amaçları için şunları söyleyeceğiz:
- Makro değişkenleri yalnızca yazdırılabilir ASCII karakter tamamen oluşan değer tutabilen hariç
;
,&
ve%
- Değerlerde ön veya arka boşluk olmayacak
- Değerler asla 255 karakterden uzun olmayacaktır
- Değerler boş olabilir
- Değerlerdeki köşeli ayraçlar ve tırnak işaretleri eşleşmeyebilir
- Orada önce ve sonra boşluk herhangi bir miktar olabilir
=
yılında%let
açıklamada ve bu boşluk göz ardı edilmelidir - Orada terminalin önce uzayın herhangi bir miktar olabilir
;
yılında%let
açıklamada ve bu boşluk benzer şekilde göz ardı edilmelidir
Bir makro değişkeni çağrıldığında, değerine "çözümlendiğini" söyleriz. Makro değişkenleri, önceden bekletilerek çözülür &
. Tanımlayıcının sonunu gösteren isteğe bağlı bir iz .
vardır. Örneğin,
%put The value of x is &X..;
The value of x is 5.
günlüğe yazar . İki periyodun gerekli olduğunu unutmayın, çünkü tek bir dönem tarafından tüketilecek &X.
ve çözülecektir 5
. Ayrıca tanımlanmış olsa da unutmayın x
küçük harflerle, &X
aynı &x
makro değişken isimleri küçük harfe duyarlı değildir çünkü.
İşte burada zorlaşıyor. &
Değişkenleri çözmek için birden fazla s birbirine eklenebilir &
ve aynı seviyedeki yuvalama çözünürlüğündeki s aynı anda çözülebilir. Örneğin,
%let i = 1;
%let coolbeans1 = broseph;
%let broseph = 5;
%put &&coolbeans&i; /* Prints broseph */
%put &&&coolbeans&i; /* Prints 5 */
Önce en içteki &
çözülür ve çözünürlük dışa doğru devam eder. Değişken ad eşleştirmesi iştahla yapılır. İkinci %put
ifadede, işlemci aşağıdaki adımları gerçekleştirir:
&i
karar verir1
ve en içteki lider&
tüketilir,&&coolbeans1
&coolbeans1
karar verirbroseph
, bize verir&broseph
&broseph
karar verir5
.
İzleyen .
s .
varsa, birden fazla &
s olsa bile , yalnızca tek bir özünürlükte tüketilir .
Görev
Yeni %let
satırlarla ayrılmış tek bir %put
deyim ile tek bir deyim arasında 1 ile 10 arasında ifade verildiğinde , %put
deyimin sonucunu yazdırın veya döndürün . Giriş herhangi bir standart şekilde kabul edilebilir.
%let
Girdinin her zaman geçerli olacağını ve ifadelerin ifadeden önce geleceğini varsayabilirsiniz %put
. Tanımlanan değişkenler sonraki %let
ifadelerde yeniden tanımlanmayacaktır .
SAS'da gerçekten çalıştırılırsa, var olmayan değişkenleri çözen değişkenlerle ilgili herhangi bir sorun olmaz ve her şey yukarıda açıklandığı gibi sözdizimsel olarak doğru olacaktır.
Örnekler
Giriş:
%let dude=stuff; %let stuff=bEaNs; %put &&dude..;
Çıktı:
bEaNs.
Giriş:
%let __6 = 6__; %put __6&__6;
Çıktı:
__66__
Giriş:
%let i=1; %let hOt1Dog = BUNS; %put &&HoT&i.Dog are FUNS&i!");
Çıktı:
BUNS are FUNS1!")
Giriş:
%let x = {*':TT7d; %put SAS is weird.;
Çıktı:
SAS is weird.
Giriş:
%let var1 = Hm?; %let var11 = var1; %let UNUSED = ; %put &&var11.....;
Çıktı:
Hm?....
Ad eşleşmesinin açgözlü olduğu için
&&var11
eşleştiğini unutmayınvar11
. Bir olsaydı.
, yani&&var1.1
, ovar1
zaman eşleştirilirdi ve ekstra 1 herhangi bir ismin parçası olmazdı.
Bu kod golf, yani bayt en kısa çözüm kazanır!
&&&&&&&&&a......................
sadece bir dönemi kaldıracak mıydı?
&stuff.
Dönemi kaldırmamalı mıyım ?