ट्रैक
/
Common Lisp
Common Lisp
/
अभ्यास
/
मोज़े और एस-एक्सप्रेशन छाँटना
मोज़े और एस-एक्सप्रेशन छाँटना

मोज़े और एस-एक्सप्रेशन छाँटना

सीखने का अभ्यास

परिचय

कमेंट

Common Lisp में प्रोग्रामर ऐसे "कमेंट" लिख सकता है जिन्हें कंप्यूटर अनदेखा कर देता है। एक लाइन वाले कमेंट एक या अधिक सेमीकोलन (;) से शुरू होते हैं, और कभी-कभी आपको यह भी दिख सकता है:

(code...) ; => value

यहाँ कमेंट यह बताने के लिए लगाया जाता है कि उस लाइन का कोड चलाने के बाद Common Lisp कौन-सी वैल्यू लौटाता है।

किसी लाइन के अंत में छोटा कमेंट लिखने के लिए एक सेमीकोलन लगाना आम बात है, कोड के किसी हिस्से के ऊपर लंबा कमेंट लिखने के लिए दो, फंक्शन जैसी किसी चीज़ का वर्णन करने वाले लंबे कमेंट के लिए तीन, और सोर्स फाइल के ऊपर हेडर जैसे कमेंट के लिए चार।

कॉन्स

Common Lisp के सभी ऑब्जेक्ट या तो "एटम" होते हैं (अकेली, अविभाज्य वैल्यू) या "कॉन्स" (जो "cons" नाम के फंक्शन से बनते हैं)। एक कॉन्स दो हिस्सों से बना होता है: पहला एलिमेंट और बाकी के एलिमेंट। ऐतिहासिक कारणों से इन दोनों हिस्सों को car और cdr कहा जाता है। जब इन कॉन्स का कोड की तरह मूल्यांकन किया जाता है, तो पहला एलिमेंट (car) उस फंक्शन को दर्शाता है जिसे कॉल किया जा रहा है, और बाकी एलिमेंट (cdr) उस फंक्शन के आर्गुमेंट दर्शाते हैं:

(<function> <arg1> <arg2> ... <argN>)
; ^ car ^  |        ^ cdr ^

एक्सप्रेशन

Common Lisp का सारा कोड एस-एक्सप्रेशन (सिंबॉलिक एक्सप्रेशन) से बना होता है। इन्हें छोटा करके एसएक्सप्र कहा जाता है। हर एसएक्सप्र या तो एक एटम होता है या एक कॉन्स। जब एस-एक्सप्रेशन का मूल्यांकन होता है, तो वह अपने आप कोई वैल्यू लौटाता है, जो उस एक्सप्रेशन की जगह ले लेती है। जब आप अपने फंक्शन बनाते हैं (defun का उपयोग करके), तो defun के अंदर की अंतिम वैल्यू अपने आप लौटा दी जाती है:

;; Defining a new function
(defun gimme-foo () 'foo)
;; Calling the function as an S-Expression
(gimme-foo) ; => FOO

सिंबल

Common Lisp में सिंबल खास वैल्यू होते हैं, जो दूसरी वैल्यू की ओर इशारा कर सकते हैं, या कीवर्ड के मामले में खुद की ओर। जब Lisp सिंबल का मूल्यांकन करता है, तो वे उन वैल्यू से बदल दिए जाते हैं जिनकी ओर वे इशारा करते हैं:

foo  ; => <whatever-foo-points-to>
:foo ; => :FOO

ध्यान रखिए कि कीवर्ड के आगे कोलन (:) लगाया जाता है।

कोट करना, यानी किसी एस-एक्सप्रेशन से पहले ' लगाना, Lisp को बताता है कि वह उस एक्सप्रेशन का मूल्यांकन न करे। अपने defun वाले उदाहरण में 'foo को कोट करके हमने Lisp को यह करने से रोक दिया कि वह ढूँढे कि FOO किसकी ओर इशारा करता है, और न मिलने पर फेल हो जाए। इसके बजाय Lisp खुद वैल्यू FOO लौटाता है। अगर हमारे प्रोग्राम में FOO को कहीं भी परिभाषित नहीं किया गया हो:

foo  ; => <ERROR! Lisp doesn't know what foo points to!>
'foo ; => FOO

अभी के लिए आप इसे सिर्फ किसी फंक्शन से सिंबल लौटाने का एक तरीका मान सकते हैं, लेकिन हम आगे के कॉन्सेप्ट अभ्यासों में कोट करने पर दोबारा बात करेंगे और इससे जुड़ी बातों को और गहराई से समझेंगे।

निर्देश

आप! हाँ, आप ही, बहादुर Lisp कोडर! Lisp एलियन Lenny को आपकी मदद चाहिए! Lenny दूसरे सारे Lisp एलियन के साथ घूमने जाना चाहते हैं, लेकिन Lenny के माता-पिता ने कह दिया है कि जब तक Lenny का कमरा साफ नहीं हो जाता, वे कहीं नहीं जाएँगे।

दिक्कत यह है कि Lenny को फर्श तक ठीक से दिखता ही नहीं! Lenny अपने एटम और कॉन्स में फर्क नहीं कर पाते, अपने सिंबल और कीवर्ड में नहीं, और अपने car और cdr में भी नहीं!

क्या आप Lenny को यह गड़बड़ सुलझाने में मदद कर सकते हैं? अपने कोष्ठक मत भूलिए, आपको इनकी ज़रूरत पड़ेगी!

1. Lenny को सिंबल याद दिलाइए

शुरू करने से पहले Lenny को यह याद करना है कि सिंबल और कीवर्ड दिखते कैसे हैं। पिछली बार सफाई किए बहुत समय हो गया है... आप Lenny की मदद दो फंक्शन बनाकर कीजिए: lennys-favorite-food, जो किसी सिंबल का मान देता है, और lennys-secret-keyword, जो किसी कीवर्ड का मान देता है। उदाहरण:

(lennys-favorite-food) ; => LASAGNA
(lennys-secret-keyword) ; => :ALIENS-ARE-REAL

ध्यान दीजिए कि आप कोई भी सिंबल या कीवर्ड लौटा सकते हैं (अगर आपको लसागना पसंद नहीं है या आप एलियन के अस्तित्व पर विश्वास नहीं करते)।

2. Lenny को एटम और कॉन्स में फर्क करने में मदद कीजिए

सिंबल और कीवर्ड की समझ ताज़ा कर लेने के बाद Lenny को सफाई शुरू करनी है! कमरे में बिखरे सारे एस-एक्सप्रेशन छाँटने के लिए Lenny को यह तय करने में मदद चाहिए कि कौन-सा कॉन्स है और कौन-सा एटम। आप दो फंक्शन लिखकर मदद कर सकते हैं: is-an-atom-p और is-a-cons-p:

(is-an-atom-p 'one-thing)    ; => T
(is-an-atom-p '(two things)) ; => NIL
(is-a-cons-p 'one-thing)    ; => NIL
(is-a-cons-p '(two things)) ; => T

इस भाग के लिए Lisp के कई बिल्ट-इन फंक्शन आपके काम आ सकते हैं। साथ ही, फिलहाल आप T को सही और NIL को गलत मान सकते हैं।

3. Lenny के कॉन्स को टुकड़ों में बाँटने में मदद कीजिए

अंत में, Lenny के कॉन्स इतने बड़े हैं कि करीने से रखे नहीं जा सकते, इसलिए Lenny को इन्हें छोटे-छोटे हिस्सों में बाँटना है। क्या आप Lenny के कॉन्स तोड़ने के लिए दो और फंक्शन बनाकर मदद कर सकते हैं (first-thing और rest-of-it)?

(first-thing '(first second third)) ; => FIRST
(rest-of-it  '(first second third)) ; => (SECOND THIRD)

यहाँ भी Common Lisp के कुछ बिल्ट-इन फंक्शन आपके काम आ सकते हैं।

GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Common Lisp Exercism

मोज़े और एस-एक्सप्रेशन छाँटना शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और Common Lisp को 27 कॉन्सेप्ट92 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।