एसएएस प्रोग्रामिंग भाषा 1966 तक किसी बेकार, पुरातन भाषा डेटिंग वापस प्रयोग में आज भी कर रही है। मूल संकलक पीएल / I में लिखा गया था , और वास्तव में PL / I से बहुत अधिक सिंटैक्स प्राप्त होता है। एसएएस में एक प्रीप्रोसेसर मैक्रो भाषा भी है जो पीएल / आई से भी प्राप्त होती है। इस चुनौती में, आप एसएएस मैक्रो भाषा के कुछ सरल तत्वों की व्याख्या करेंगे।
एसएएस मैक्रो भाषा में, %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 को एक साथ मारा जा सकता है, और &
एक ही समय में नेस्टिंग के समान स्तर पर हल किया जा सकता है। उदाहरण के लिए,
%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
कथनों में फिर से परिभाषित नहीं किया जाएगा ।
यदि वास्तव में एसएएस में चलाया जाता है, तो चर के समाधान के लिए कोई समस्या नहीं होगी, जो कि चर में मौजूद नहीं है और ऊपर वर्णित सभी चीज़ों को वाक्यविन्यास रूप से सही किया जाएगा।
उदाहरण
इनपुट:
%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.
अवधि नहीं निकालना चाहिए ?