ภาษาการเขียนโปรแกรม SASเป็น clunky โบราณภาษาย้อนหลังไปถึง 1966 ที่ยังคงใช้อยู่ในปัจจุบัน คอมไพเลอร์ดั้งเดิมเขียนด้วยPL / Iและแน่นอนว่าไวยากรณ์ส่วนใหญ่มาจาก PL / I SAS ยังมีภาษามาโครตัวประมวลผลล่วงหน้าซึ่งมาจากPL / Iเช่นกัน ในความท้าทายนี้คุณจะตีความองค์ประกอบง่ายๆของภาษาแมโคร SAS
ในภาษาแมโคร SAS ตัวแปรแมโครจะถูกกำหนดโดยใช้คำหลักและการพิมพ์เข้าสู่ระบบจะทำด้วย%let
%put
งบสิ้นสุดด้วยเครื่องหมายอัฒภาค นี่คือตัวอย่างบางส่วน:
%let x = 5;
%let cool_beans =Cool beans;
%let what123=46.lel"{)-++;
ชื่อตัวแปรมาโครไม่คำนึงถึงขนาดตัวพิมพ์และตรงกับนิพจน์ทั่วไป/[a-z_][a-z0-9_]*/i
เสมอ สำหรับจุดประสงค์ของการท้าทายนี้เราจะพูดดังนี้:
- ตัวแปรมาโครเท่านั้นที่สามารถเก็บค่าประกอบด้วยทั้งตัวอักขระ ASCII ยกเว้น
;
,&
และ%
- จะไม่มีช่องว่างนำหน้าหรือต่อท้ายในค่า
- ค่าจะไม่ยาวเกิน 255 อักขระ
- ค่าอาจว่างเปล่า
- วงเล็บและเครื่องหมายคำพูดในค่าอาจไม่ตรงกัน
- สามารถมีจำนวนช่องว่างใด ๆ ก่อนและหลัง
=
ใน%let
คำสั่งและควรเว้นช่องว่างนี้ - สามารถมีจำนวนช่องว่างใด ๆ ก่อนที่เทอร์มินัล
;
ใน%let
คำสั่งและควรเว้นช่องว่างนี้ในทำนองเดียวกัน
เมื่อเรียกตัวแปรมาโครเราจะบอกว่า "แก้ไข" ค่าของมัน ตัวแปรมาโครได้รับการแก้ไขโดย&
ต่อท้าย มีตัวเลือกต่อท้าย.
ที่แสดงถึงจุดสิ้นสุดของตัวระบุ ตัวอย่างเช่น,
%put The value of x is &X..;
เขียนThe value of x is 5.
ลงในบันทึก โปรดทราบว่าสองช่วงจะต้องเพราะเป็นระยะเวลาเดียวจะนำมาบริโภคโดยและมีมติให้&X.
5
โปรดทราบว่าแม้ว่าเราจะกำหนดเป็นx
ตัวพิมพ์เล็ก แต่&X
ก็เป็น&x
เพราะชื่อตัวแปรมาโครนั้นไม่ตรงตามตัวพิมพ์เล็กและใหญ่
นี่คือสิ่งที่มันยุ่งยาก หลาย&
s สามารถรวมเข้าด้วยกันเพื่อแก้ไขตัวแปรและ&
s ที่ระดับเดียวกันของการซ้อนการแก้ไขในเวลาเดียวกัน ตัวอย่างเช่น,
%let i = 1;
%let coolbeans1 = broseph;
%let broseph = 5;
%put &&coolbeans&i; /* Prints broseph */
%put &&&coolbeans&i; /* Prints 5 */
วิธี&
แก้ปัญหาที่อยู่ด้านในสุดก่อน การจับคู่ชื่อตัวแปรทำอย่างตะกละตะกลาม ใน%put
คำสั่งที่สองตัวประมวลผลทำขั้นตอนต่อไปนี้:
&i
แก้ไขให้1
และผู้นำด้านในสุด&
ถูกบริโภคให้เรา&&coolbeans1
&coolbeans1
แก้ไขเพื่อbroseph
ให้เรา&broseph
&broseph
5
มีมติให้
หากมีการต่อท้าย.
s จะมีการ.
ใช้ความละเอียดเพียงอันเดียวแม้ว่าจะมีหลาย&
s ก็ตาม
งาน
รับระหว่าง 1 ถึง 10 %let
คำสั่งคั่นด้วยการขึ้นบรรทัดใหม่และ%put
คำสั่งเดียวพิมพ์หรือส่งคืนผลลัพธ์ของ%put
คำสั่ง อินพุตสามารถยอมรับได้ในวิธีมาตรฐาน
คุณสามารถสมมติว่าการป้อนข้อมูลจะถูกต้องเสมอและ%let
คำสั่งจะนำหน้า%put
คำสั่ง ตัวแปรที่กำหนดไว้จะไม่ถูกนิยามใหม่ใน%let
คำสั่งภายหลัง
หากใช้งานจริงใน SAS จะไม่มีปัญหากับตัวแปรที่แปลงค่าเป็นตัวแปรที่ไม่มีอยู่และทุกอย่างจะถูกแก้ไขตามที่อธิบายไว้ข้างต้น
ตัวอย่าง
การป้อนข้อมูล:
%let dude=stuff; %let stuff=bEaNs; %put &&dude..;
เอาท์พุท:
bEaNs.
การป้อนข้อมูล:
%let __6 = 6__; %put __6&__6;
เอาท์พุท:
__66__
การป้อนข้อมูล:
%let i=1; %let hOt1Dog = BUNS; %put &&HoT&i.Dog are FUNS&i!");
เอาท์พุท:
BUNS are FUNS1!")
การป้อนข้อมูล:
%let x = {*':TT7d; %put SAS is weird.;
เอาท์พุท:
SAS is weird.
การป้อนข้อมูล:
%let var1 = Hm?; %let var11 = var1; %let UNUSED = ; %put &&var11.....;
เอาท์พุท:
Hm?....
โปรดทราบว่าการ
&&var11
จับคู่var11
เนื่องจากการจับคู่ชื่อเป็นโลภ หากมีเคยเป็น.
เช่น&&var1.1
นั้นvar1
จะได้รับการจับคู่และพิเศษ 1 จะไม่เป็นส่วนหนึ่งของชื่อใด ๆ
นี่คือรหัสกอล์ฟดังนั้นทางออกที่สั้นที่สุดในหน่วยไบต์ชนะ!
&&&&&&&&&a......................
จะยังคงลบหนึ่งช่วงเวลาเท่านั้น?
&stuff.
ลบช่วงเวลานี้ใช่ไหม