क्लेम प्रथम श्रेणी के कार्यों की विशेषता वाली एक न्यूनतम स्टैक-आधारित प्रोग्रामिंग भाषा है। आपका उद्देश्य क्लेम भाषा के लिए दुभाषिया लिखना है। इसे संदर्भ कार्यान्वयन में शामिल सभी उदाहरणों को ठीक से निष्पादित करना चाहिए, जो यहां उपलब्ध है ।
- हमेशा की तरह, मानक खामियां लागू होती हैं।
- बाइट गिनती जीत से सबसे छोटी प्रविष्टि।
क्लेम भाषा
क्लेम प्रथम श्रेणी के कार्यों के साथ एक स्टैक आधारित प्रोग्रामिंग भाषा है। क्लेम सीखने का सबसे अच्छा तरीका है clem
दुभाषिया को बिना किसी तर्क के चलाना । यह इंटरैक्टिव मोड में शुरू होगा, जिससे आप उपलब्ध कमांड के साथ खेल सकेंगे। उदाहरण प्रोग्राम चलाने के लिए, clem example.clm
जहाँ उदाहरण प्रोग्राम का नाम है। यह संक्षिप्त ट्यूटोरियल आपको आरंभ करने के लिए पर्याप्त होना चाहिए।
कार्यों के दो मुख्य वर्ग हैं। परमाणु कार्य और यौगिक कार्य। यौगिक कार्यों की सूची अन्य यौगिक कार्यों और परमाणु कार्यों से बनी होती है। ध्यान दें कि एक यौगिक कार्य में स्वयं शामिल नहीं हो सकता है।
परमाणु कार्य
पहला प्रकार का परमाणु कार्य स्थिर है । एक स्थिरांक केवल एक पूर्णांक मान है। उदाहरण के लिए, -10। जब दुभाषिया एक स्थिर का सामना करता है , तो यह उसे ढेर में धकेल देता है। clem
अब दौड़ो । -10
प्रॉम्प्ट पर टाइप करें । तुम्हे देखना चाहिए
> -10
001: (-10)
>
मान 001
स्टैक में फ़ंक्शन की स्थिति का वर्णन करता (-10)
है और स्थिर है जो आपने अभी दर्ज किया है। अब +11
प्रॉम्प्ट पर दर्ज करें । तुम्हे देखना चाहिए
> +11
002: (-10)
001: (11)
>
सूचना जो (-10)
स्टैक में दूसरे स्थान पर आ गई है और (11)
अब पहले स्थान पर है। यह एक ढेर की प्रकृति है! आप देखेंगे कि -
डिक्रिमेंट कमांड भी है। जब भी -
या +
एक नंबर पूर्व में होना है, वे उस नंबर के हस्ताक्षर और नहीं इसी आदेश को दर्शाते हैं। अन्य सभी परमाणु कार्य आज्ञा हैं । कुल 14 हैं:
@ Rotate the top three functions on the stack
# Pop the function on top of the stack and push it twice
$ Swap the top two functions on top of the stack
% Pop the function on top of the stack and throw it away
/ Pop a compound function. Split off the first function, push what's left,
then push the first function.
. Pop two functions, concatenate them and push the result
+ Pop a function. If its a constant then increment it. Push it
- Pop a function. If its a constant then decrement it. Push it
< Get a character from STDIN and push it to the stack. Pushes -1 on EOF.
> Pop a function and print its ASCII character if its a constant
c Pop a function and print its value if its a constant
w Pop a function from the stack. Peek at the top of the stack. While it is
a non-zero constant, execute the function.
प्रॉम्प्ट पर कमांड टाइप करने पर कमांड निष्पादित होगी। #
प्रॉम्प्ट (डुप्लिकेट कमांड) पर टाइप करें । तुम्हे देखना चाहिए
> #
003: (-10)
002: (11)
001: (11)
>
ध्यान दें कि (11) को डुप्लिकेट किया गया है। अब %
प्रॉम्प्ट (ड्रॉप कमांड) पर टाइप करें । तुम्हे देखना चाहिए
> %
002: (-10)
001: (11)
>
एक कमांड को स्टैक पर धकेलने के लिए, इसे कोष्ठक में लगाएं। (-)
प्रॉम्प्ट पर टाइप करें । यह वेतन वृद्धि ऑपरेटर को स्टैक पर धकेल देगा। तुम्हे देखना चाहिए
> (-)
003: (-10)
002: (11)
001: (-)
>
यौगिक कार्य
आप कोष्ठक कार्य करने के लिए कोष्ठक में कई परमाणु क्रियाओं को शामिल कर सकते हैं। जब आप प्रॉम्प्ट पर एक कंपाउंड फंक्शन डालते हैं, तो इसे स्टैक पर धकेल दिया जाता है। ($+$)
प्रॉम्प्ट पर टाइप करें । तुम्हे देखना चाहिए
> ($+$)
004: (-10)
003: (11)
002: (-)
001: ($ + $)
>
तकनीकी रूप से, स्टैक पर सब कुछ एक यौगिक फ़ंक्शन है। हालांकि, स्टैक पर कुछ यौगिक कार्य एक एकल परमाणु फ़ंक्शन से मिलकर होते हैं (जिस स्थिति में, हम उन्हें सुविधा के लिए परमाणु कार्य मानते हैं)। जब स्टैक पर यौगिक कार्यों में हेरफेर किया जाता है, तो .
कमांड (कंक्रीटिंग) अक्सर उपयोगी होता है। .
अब टाइप करें । तुम्हे देखना चाहिए
> .
003: (-10)
002: (11)
001: (- $ + $)
>
ध्यान दें कि स्टैक पर पहले और दूसरे फ़ंक्शन को संक्षिप्त किया गया था, और स्टैक पर दूसरा फ़ंक्शन परिणामी सूची में पहले स्थान पर आता है। एक फ़ंक्शन को निष्पादित करने के लिए जो स्टैक पर है (चाहे वह परमाणु या यौगिक है), हमें w
कमांड (जबकि) जारी करना होगा । w
आदेश ढेर पर पहला समारोह पॉप और इतने लंबे समय के ढेर पर दूसरा समारोह एक गैर शून्य स्थिर है के रूप में बार-बार यह निष्पादित करेंगे। अगर हम टाइप करते हैं तो क्या होगा, इसका अनुमान लगाने की कोशिश करें w
। अब, टाइप करें w
। तुम्हे देखना चाहिए
> w
002: (1)
001: (0)
>
क्या आपसे यही उम्मीद है? ढेर के ऊपर बैठे दो नंबरों को जोड़ा गया और उनकी राशि बनी हुई है। चलो फिर से कोशिश करते हैं। पहले हम शून्य को छोड़ देंगे और टाइप करके 10 धक्का देंगे %10
। तुम्हे देखना चाहिए
> %10
002: (1)
001: (10)
>
अब हम एक शॉट में पूरे फ़ंक्शन को टाइप करेंगे, लेकिन हम %
शून्य से छुटकारा पाने के लिए एक अतिरिक्त जोड़ देंगे । (-$+$)w%
प्रॉम्प्ट पर टाइप करें । तुम्हे देखना चाहिए
> (-$+$)w%
001: (11)
>
(ध्यान दें कि यह एल्गोरिथम केवल तभी काम करता है जब स्टैक पर पहला स्थिरांक सकारात्मक हो)।
स्ट्रिंग्स
तार भी मौजूद हैं। वे ज्यादातर सिंटैक्टिक चीनी हैं, लेकिन काफी उपयोगी हो सकते हैं। जब दुभाषिया एक स्ट्रिंग का सामना करता है, तो यह स्टैक पर पिछले से लेकर पहले तक प्रत्येक वर्ण को धकेलता है। %
पिछले उदाहरण से 11 ड्रॉप करने के लिए टाइप करें। अब, 0 10 "Hi!"
प्रॉम्प्ट पर टाइप करें । 0
एक शून्य टर्मिनेटर से जोड़ दिया जाएगा और 10
एक नई लाइन चरित्र डाल देंगे। तुम्हे देखना चाहिए
> 0 10 "Hi!"
005: (0)
004: (10)
003: (33)
002: (105)
001: (72)
>
(>)w
स्टैक से वर्ण प्रिंट करने के लिए टाइप करें जब तक कि हम NULL टर्मिनेटर का सामना न करें। तुम्हे देखना चाहिए
> (>)w
Hi!
001: (0)
>
निष्कर्ष
उम्मीद है कि इंटरप्रेटर के साथ आपको शुरू करने के लिए यह पर्याप्त होना चाहिए। भाषा का डिज़ाइन अपेक्षाकृत सीधा-आगे होना चाहिए। मुझे पता है कि कुछ भी बहुत अस्पष्ट है :) कुछ चीजें जानबूझकर अस्पष्ट छोड़ी गई हैं: मूल्यों पर हस्ताक्षर किए जाने चाहिए और कम से कम 16 बिट्स होने चाहिए, सभी संदर्भ कार्यक्रमों को चलाने के लिए स्टैक काफी बड़ा होना चाहिए, आदि कई विवरणों को तराशा नहीं गया है। यहाँ क्योंकि पूर्ण विकसित भाषा विनिर्देश पोस्ट करने के लिए निषेधात्मक रूप से बड़ा होगा (और मैंने अभी तक एक भी नहीं लिखा है: पी)। जब संदेह हो, तो संदर्भ कार्यान्वयन की नकल करें।