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 %letanahtar 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%letaçıklamada ve bu boşluk göz ardı edilmelidir - Orada terminalin önce uzayın herhangi bir miktar olabilir
;yılında%letaçı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 xküçük harflerle, &Xaynı &xmakro 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 %putifadede, işlemci aşağıdaki adımları gerçekleştirir:
&ikarar verir1ve en içteki lider&tüketilir,&&coolbeans1&coolbeans1karar verirbroseph, bize verir&broseph&brosephkarar verir5.
İzleyen .s .varsa, birden fazla &s olsa bile , yalnızca tek bir özünürlükte tüketilir .
Görev
Yeni %letsatırlarla ayrılmış tek bir %putdeyim ile tek bir deyim arasında 1 ile 10 arasında ifade verildiğinde , %putdeyimin sonucunu yazdırın veya döndürün . Giriş herhangi bir standart şekilde kabul edilebilir.
%letGirdinin her zaman geçerli olacağını ve ifadelerin ifadeden önce geleceğini varsayabilirsiniz %put. Tanımlanan değişkenler sonraki %letifadelerde 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
&&var11eşleştiğini unutmayınvar11. Bir olsaydı., yani&&var1.1, ovar1zaman 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 ?