मैपिंग का मतलब है किसी सीक्वेंस के हर एलिमेंट पर एक फंक्शन लगाकर एक नया सीक्वेंस बनाना।
यह काम mapcar फंक्शन की मदद से किसी ऐरे पर आसानी से किया जा सकता है।
मान लीजिए हमारे पास एक फंक्शन double है जो अपने आर्गुमेंट को 2 से गुणा करता है:
(mapcar #'double '(1 2 3 4)) ; => (2 4 6 8)
ध्यान दीजिए कि पहला आर्गुमेंट उस फंक्शन का है जिसे कॉल करना है। #' एक खास कोटिंग सिंटैक्स है, जिससे फंक्शन बताया जाता है।
double को सबसे पहले पहले एलिमेंट के साथ कॉल किया गया, फिर दूसरे एलिमेंट के साथ, और इसी तरह आगे भी।
नतीजे एक ऐरे में इकट्ठा किए गए, और यही वैल्यू उस एक्सप्रेशन की वैल्यू है।
फिल्टरिंग वह प्रक्रिया है जिसमें किसी सीक्वेंस से एक नया सीक्वेंस बनाया जाता है। इसमें मूल सीक्वेंस के कुछ एलिमेंट छोड़कर बाकी सब कॉपी किए जाते हैं। यह तय करना कि नए सीक्वेंस में कौन-कौन से आइटम शामिल होंगे, किसी प्रेडिकेट फंक्शन (ऐसा फंक्शन जो बूलियन वैल्यू देता है) से किया जा सकता है, या किसी खास ऑब्जेक्ट के साथ बराबरी की जाँच से किया जा सकता है।
remove-if एक फंक्शन है जो आर्गुमेंट के तौर पर एक प्रेडिकेट फंक्शन और एक सीक्वेंस लेता है, और ऐसा सीक्वेंस लौटाता है जिसमें सिर्फ वे एलिमेंट होते हैं जिनके लिए प्रेडिकेट ने गलत वैल्यू दी थी।
दूसरे शब्दों में, यह सीक्वेंस के उन सभी एलिमेंट को "हटा देता है" जिनके लिए प्रेडिकेट सही वैल्यू देता है। लेकिन ध्यान रखिए, यह फंक्शन मूल सीक्वेंस को बदलता नहीं है!
इसके बजाय यह एक नया सीक्वेंस लौटाता है, जिसमें वे एलिमेंट नहीं होते। अगर प्रेडिकेट सभी वैल्यू के लिए सही रहा, तो खाली सीक्वेंस लौटाया जाता है।
(remove-if #'evenp '(1 2 3 4 5)) ; => (1 3 5)
(remove-if #'oddp '(1 3 5)) ; => ()
अगर किसी सीक्वेंस से कोई खास आइटम हटाना हो, तो remove इस्तेमाल किया जा सकता है, जो हटाने वाला आइटम और एक सीक्वेंस लेता है।
सीक्वेंस की जो भी वैल्यू हटाने वाले आइटम के बराबर नहीं हैं, वे सब लौटा दी जाती हैं।
ध्यान दें: बराबरी की जाँच डिफ़ॉल्ट रूप से eql जेनेरिक समानता प्रेडिकेट से की जाती है।
(remove 1 '(1 2 1 3 1 4)) ; => (2 3 4)
(remove #\l "hello") ; => "heo"
Lisp एलियन लूसी को संख्याएँ पसंद हैं और उन्हें लगता है कि इनमें से कुछ "शानदार" हैं।
वे आपसे मदद माँगते हैं कि आप ऐसे फंक्शन लिखें जो संख्याओं को और शानदार बना दें।
लूसी की नज़र में किसी संख्या को शानदार बनाने वाली बात बदल सकती है, इसलिए इन फंक्शनों को लचीला होना पड़ेगा।
संख्याओं के एक ऐरे को और शानदार संख्याओं के ऐरे में बदलने के लिए आपको make-magnificent-maybe नाम का एक फंक्शन लिखना होगा। यह दो चीज़ें लेता है: एक फंक्शन, जिसे संख्याओं पर लागू करना है, और संख्याओं का एक ऐरे।
इसका मान संख्याओं का एक ऐसा ऐरे होना चाहिए जिसकी हर संख्या पहले से ज़्यादा शानदार हो (दिए गए फंक्शन के हिसाब से)।
(make-magnificent-maybe #'square '(1 2 3)) ; => (1 4 9)
(make-magnificent-maybe #'1+ '(1 2 3)) ; => (2 3 4)
संख्याओं को और शानदार बनाने के बाद (उम्मीद है कि ऐसा होगा), लूसी सिर्फ उन संख्याओं को देखना चाहते हैं जो वास्तव में शानदार हैं।
वे पक्का जानते हैं कि संख्या 1 कभी भी शानदार नहीं होती, इसलिए आपको बस उसे हटा देना है।
लेकिन इसके अलावा लूसी कभी-कभी अपना मन बदल देते हैं, इसलिए वे फिर से आपको एक फंक्शन देंगे, जो बताएगा कि कोई संख्या शानदार है या नहीं।
आपको only-the-best नाम का एक फंक्शन लिखना होगा, जो एक फंक्शन और संख्याओं का एक ऐरे लेता है और सिर्फ सबसे अच्छी संख्याएँ लौटाता है (न 1, और न ही वे संख्याएँ जिनके लिए यह फंक्शन सही लौटाता है)।
(only-the-best #'evenp '(1 2 3 4 5)) ; => (3 5)
(only-the-best #'oddp '(1 3 5)) ; => ()
Exercism पर साइन अप कीजिए और Common Lisp को 27 कॉन्सेप्ट92 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।