Common Lisp में कोई वैश्विक फंक्शन बनाने के लिए defun एक्सप्रेशन इस्तेमाल किया जाता है।
यह एक्सप्रेशन अपने पहले आर्गुमेंट के रूप में पैरामीटर की एक सूची लेता है (खाली सूची का मतलब है कि फंक्शन में कोई पैरामीटर नहीं है)।
इसके बाद एक वैकल्पिक डॉक्युमेंटेशन स्ट्रिंग आती है (नीचे देखिए), और फिर शून्य या अधिक एक्सप्रेशन, जो फंक्शन की "बॉडी" बनाते हैं।
फंक्शन में शून्य या अधिक पैरामीटर हो सकते हैं।
(defun no-args () (+ 1 1))
(defun add-one (x) (1+ x))
(defun add-nums (x y) (+ x y))
किसी फंक्शन को कॉल करने के लिए एक एक्सप्रेशन का मूल्यांकन किया जाता है। उस एक्सप्रेशन का पहला एलिमेंट वह सिंबल होता है जो फंक्शन को दर्शाता है, और बाकी आइटम फंक्शन के आर्गुमेंट होते हैं (अगर कोई हों)।
जब किसी फंक्शन का मूल्यांकन किया जाता है, तो उस फंक्शन की वैल्यू उसकी बॉडी में मूल्यांकित हुए अंतिम एक्सप्रेशन की वैल्यू होती है। सभी फंक्शन एक वैल्यू पर मूल्यांकित होते हैं।
(add-nums 2 2) ;; => 4
फंक्शन में वैकल्पिक रूप से एक डॉक्युमेंटेशन स्ट्रिंग भी हो सकती है (जिसे "डॉकस्ट्रिंग" भी कहा जाता है)।
अगर यह दी गई हो, तो यह आर्गुमेंट की सूची के बाद आती है, लेकिन फंक्शन की बॉडी से पहले।
डॉक्युमेंटेशन स्ट्रिंग documentation से प्राप्त की जा सकती है।
(defun add-nums (x y) "Add X and Y together" (+ x y))
(documentation 'add-nums 'function) ;; => "Add X and Y together"
;; Note that if one provides a docstring but fails to provide a body
;; then the docstring is interpreted by Common Lisp as the body, not
;; the docstring
(defun no-body ())
(no-body) ;; => NIL
(defun mistake () "This is not a docstring")
(mistake) ;; => "This is not a docstring"
(documentation 'mistake 'function) ;; => NIL
लिस्प एलियन लिली वापस आ गए हैं और अब और खाना बना रहे हैं! इस बार वे लिस्प एलियन लसैग्ना बनाएँगे, जो मानव लसैग्ना से पूरी तरह अलग नहीं है।
लसैग्ना पकाने में कितना समय लगेगा, यह पता लगाने के लिए लिली को कुछ फंक्शन लिखवाने होंगे। और हर फंक्शन के साथ अच्छा डॉक्युमेंटेशन होना चाहिए, ताकि लिली यह न भूलें कि कौन-सा फंक्शन क्या करता है।
क्या आप लिली को ऐसे फंक्शन लिखने में मदद कर सकते हैं जिनसे लसैग्ना पकाने में लगने वाला समय पता लगाया जा सके?
expected-time-in-oven नाम का फंक्शन बनाइए, जो कोई पैरामीटर नहीं लेता और बताता है कि लसैग्ना को ओवन में कितने मिनट रहना चाहिए। लिस्प एलियन परंपरा के अनुसार (ठीक वैसे ही जैसे लिली के माता-पिता पकाते थे), ओवन में लगने वाला अपेक्षित समय 337 मिनट है:
(expected-time-in-oven) ;; => 337
remaining-minutes-in-oven नाम का फंक्शन बनाइए। यह पैरामीटर के रूप में वे वास्तविक मिनट लेता है जितनी देर लसैग्ना ओवन में रह चुका है, और पिछले काम में तय किए गए अपेक्षित समय के आधार पर बताता है कि लसैग्ना को ओवन में अभी कितने मिनट और रहना है।
(remaining-minutes-in-oven 100) ;; => 237
preparation-time-in-minutes नाम का फंक्शन बनाइए। यह पैरामीटर के रूप में उन परतों की संख्या लेता है जो लिली ने लसैग्ना में जोड़ीं, और बताता है कि लसैग्ना तैयार करने में लिली ने कितने मिनट लगाए, यह मानते हुए कि हर परत तैयार करने में 19 मिनट लगते हैं।
(preparation-time-in-minutes 3) ;; => 57
elapsed-time-in-minutes नाम का फंक्शन बनाइए, जो दो पैरामीटर लेता है: पहला पैरामीटर उन परतों की संख्या है जो लिली ने लसैग्ना में जोड़ीं, और दूसरा पैरामीटर वे मिनट हैं जितनी देर लसैग्ना ओवन में रह चुका है। फंक्शन को बताना चाहिए कि लसैग्ना पकाने में लिली ने कितने मिनट काम किया, यानी तैयारी में लगे मिनट और उस समय तक ओवन में लसैग्ना के बिताए मिनट का जोड़।
(elapsed-time-in-minutes 3 100) ;; => 157
Exercism पर साइन अप कीजिए और Common Lisp को 27 कॉन्सेप्ट92 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।