The SAS bahasa pemrograman adalah kikuk, kuno bahasa dating kembali ke 1966 yang masih digunakan sampai sekarang. Kompiler asli ditulis dalam PL / I , dan memang banyak sintaks yang berasal dari PL / I. SAS juga memiliki bahasa makro preprosesor yang berasal dari bahasa PL / I juga. Dalam tantangan ini, Anda akan menafsirkan beberapa elemen sederhana dari bahasa makro SAS.
Dalam bahasa makro SAS, variabel makro didefinisikan menggunakan %let
kata kunci dan pencetakan ke log dilakukan dengan %put
. Pernyataan diakhiri dengan titik koma. Berikut ini beberapa contohnya:
%let x = 5;
%let cool_beans =Cool beans;
%let what123=46.lel"{)-++;
Nama variabel makro tidak sensitif huruf dan selalu cocok dengan persamaan reguler /[a-z_][a-z0-9_]*/i
. Untuk keperluan tantangan ini, kami akan mengatakan yang berikut:
- Variabel makro hanya bisa memegang nilai-nilai yang terdiri sepenuhnya dari karakter ASCII yang dapat dicetak kecuali
;
,&
, dan%
- Tidak akan ada spasi awal atau akhir dalam nilai
- Nilai tidak akan pernah lebih dari 255 karakter
- Nilai mungkin kosong
- Kurung dan tanda kutip dalam nilai mungkin tidak cocok
- Mungkin ada jumlah ruang sebelum dan sesudah
=
dalam%let
pernyataan dan ruang ini harus diabaikan - Mungkin ada jumlah ruang sebelum terminal
;
dalam%let
pernyataan dan ruang ini juga harus diabaikan
Ketika variabel makro dipanggil, kita katakan itu "diselesaikan" ke nilainya. Variabel makro diselesaikan dengan memprioritaskan &
. Ada trailing opsional.
yang menunjukkan akhir pengidentifikasi. Sebagai contoh,
%put The value of x is &X..;
menulis The value of x is 5.
ke log. Perhatikan bahwa dua periode diperlukan karena satu periode akan dikonsumsi oleh &X.
dan diselesaikan 5
. Perhatikan juga bahwa meskipun kita definisikan x
dalam huruf kecil, &X
sama dengan &x
karena nama variabel makro tidak sensitif huruf.
Di sinilah rumit. Beberapa &
s dapat dirangkai bersama untuk menyelesaikan variabel, dan &
s pada tingkat yang sama menyelesaikan sarang pada saat yang sama. Sebagai contoh,
%let i = 1;
%let coolbeans1 = broseph;
%let broseph = 5;
%put &&coolbeans&i; /* Prints broseph */
%put &&&coolbeans&i; /* Prints 5 */
Keputusan terdalam &
pertama, dan resolusi berlanjut ke luar. Pencocokan nama variabel dilakukan dengan rakus. Dalam %put
pernyataan kedua , prosesor membuat langkah-langkah berikut:
&i
memutuskan untuk1
, dan pimpinan terdalam&
dikonsumsi, memberi kita&&coolbeans1
&coolbeans1
memutuskan untukbroseph
, memberi kita&broseph
&broseph
memutuskan untuk5
.
Jika ada trailing .
s, hanya satu .
yang dikonsumsi dalam resolusi, bahkan jika ada beberapa &
s.
Tugas
Diberikan antara 1 dan 10 %let
pernyataan yang dipisahkan oleh baris baru dan satu %put
pernyataan, cetak atau kembalikan hasil %put
pernyataan tersebut. Input dapat diterima dengan cara standar apa pun.
Anda dapat mengasumsikan bahwa input akan selalu valid dan bahwa %let
pernyataan akan mendahului %put
pernyataan. Variabel yang didefinisikan tidak akan didefinisikan ulang dalam %let
laporan nanti .
Jika benar-benar berjalan di SAS, tidak akan ada masalah dengan variabel yang menyelesaikan variabel yang tidak ada dan semuanya akan benar secara sintaksis seperti dijelaskan di atas.
Contohnya
Memasukkan:
%let dude=stuff; %let stuff=bEaNs; %put &&dude..;
Keluaran:
bEaNs.
Memasukkan:
%let __6 = 6__; %put __6&__6;
Keluaran:
__66__
Memasukkan:
%let i=1; %let hOt1Dog = BUNS; %put &&HoT&i.Dog are FUNS&i!");
Keluaran:
BUNS are FUNS1!")
Memasukkan:
%let x = {*':TT7d; %put SAS is weird.;
Keluaran:
SAS is weird.
Memasukkan:
%let var1 = Hm?; %let var11 = var1; %let UNUSED = ; %put &&var11.....;
Keluaran:
Hm?....
Perhatikan bahwa
&&var11
kecocokanvar11
karena pencocokan nama serakah. Jika ada.
, yaitu&&var1.1
, makavar1
akan dicocokkan dan 1 tambahan tidak akan menjadi bagian dari nama apa pun.
Ini kode golf, jadi solusi terpendek dalam byte menang!
&&&&&&&&&a......................
apakah hanya akan menghapus satu periode?
&stuff.
menghapus periode?