لتعريف دالة عامة في 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
ويمكن أن يكون للدالة أيضًا، بشكل اختياري، سلسلة نصية للتوثيق (تُسمّى أيضًا "docstring").
وإذا وُجدت فإنها تأتي بعد قائمة الوسائط وقبل جسم الدالة.
ويمكن الوصول إلى سلسلة التوثيق النصية عبر 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
عادت ليلي، الكائن الفضائي Lisp Alien، وهي تطبخ أكثر من قبل! هذه المرة ستُعدّ لازانيا الكائن الفضائي Lisp Alien، وهي ليست مختلفة تمامًا عن لازانيا البشر.
ستحتاج ليلي إلى كتابة بعض الدوال لمساعدتها في تحديد توقيت طهي اللازانيا. ويحتاج كل منها إلى توثيق جيد حتى لا تنسى ليلي ما تفعله كل واحدة منها.
هل يمكنك مساعدة ليلي في كتابة دوال تساعدها في ضبط وقت طهي اللازانيا؟
عرّف الدالة expected-time-in-oven التي لا تأخذ أي معاملات، وتُرجع عدد الدقائق التي ينبغي أن تبقى فيها اللازانيا في الفرن. وفقًا لتقليد الكائن الفضائي Lisp Alien (تمامًا كما اعتادت الوحدة الوالدية الخاصة بليلي أن تطبخ)، فإن زمن الفرن المتوقع بالدقائق هو 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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.