ภาษาการเขียนโปรแกรม 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&broseph5มีมติให้
หากมีการต่อท้าย.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.ลบช่วงเวลานี้ใช่ไหม