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টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।