الدوال
تُعدّ الدوال مفهومًا أساسيًا في Scheme: فهي توفر وسيلة لتغليف المنطق وإعادة استخدام التعليمات البرمجية وتنظيم النصوص بفعالية. باستخدام الدوال، يمكنك إنشاء نصوص معيارية وقابلة للصيانة تتعامل مع مهام متنوعة، من العمليات الأساسية إلى سير عمل Lumi المتقدم.
يُقدّم هذا القسم مقدمة للدوال في Scheme ويضع الأساس لفهم أنواعها وتعريفاتها واستخداماتها. ستتعمّق الأقسام التالية في أنواع دوال محددة وقدراتها الفريدة.
الحد الأدنى من بناء الجملة والتعبيرات
يتكوّن Scheme من تعبيرات. يُقيَّم كل تعبير إلى قيمة. بناء الجملة موحّد: الأقواس تشكّل استدعاءً، مع اسم المُعامل أو الدالة أولًا.
(+ 1 2) ; يجمع 1 و 2، النتيجة 3
(if #t 1 0) ; ينتج 1 لأن الشرط صحيح
(list 1 2 3) ; ينشئ قائمة: (1 2 3)بما أن كل شيء تعبير، يتناسب تدفق التحكم طبيعيًا مع نفس نمط استدعاءات الدوال.
ما أهمية الدوال؟
تلعب الدوال دورًا محوريًا في Scheme لعدة أسباب:
- إعادة استخدام التعليمات البرمجية: تجنّب التكرار بتغليف المنطق في مكونات قابلة لإعادة الاستخدام.
- النمطية: تقسيم المهام المعقدة إلى أجزاء أصغر يمكن إدارتها.
- السلوك الديناميكي: قبول معلمات للتعامل مع مدخلات مختلفة أو التكيف مع مواقف مختلفة.
- تجريد أعلى: تبسيط المنطق بالتركيز على «ما» تفعله الدالة بدل «كيف» تفعل ذلك.
نظرة عامة على أنواع الدوال
يقدّم Scheme مجموعة متنوعة من بنى الدوال، كل منها يناسب حالات استخدام محددة:
الدوال المُسمّاة هذه الدوال القياسية المُعرَّفة بـ
define. تشكّل العمود الفقري لمعظم النصوص.(define (square x) (* x x))دوال lambda دوال مجهولة الاسم تُعرَّف inline للاستخدام لمرة واحدة.
(lambda (x) (* x x))دوال ذات ترتيب أعلى دوال تأخذ دوالًا أخرى كوسائط أو تُرجع دوالًا كنتائج، ما يتيح تجريدات قوية مثل
mapوالتصفية والاختزال.(map (lambda (x) (* x x)) '(1 2 3 4)) ; يرجع (1 4 9 16)
بناء الجملة العام للدوال
للدوال في Scheme بناء جملة بسيط ومتسق:
(define (function-name parameter1 parameter2 ...)
body-expression)function-name: اسم الدالة.parameter1, parameter2, ...: الوسائط التي تستقبلها الدالة.body-expression: المنطق الذي يُنفَّذ عند استدعاء الدالة.
مثال:
(define (add x y)
(+ x y))
(add 3 5) ; يرجع 8الآثار الجانبية والحالة العامة
في Lumi، كثير من الإجراءات المفيدة لها آثار جانبية: تعدّل صورة، أو تغيّر رسمًا، أو تكتب ملفًا، أو تعرض مخرجات.
- عزل الآثار الجانبية في إجراءات صغيرة محددة بوضوح.
- تجنّب تغيير السياق العام إلا عند الحاجة.
- عند تغيير السياق (الألوان، الفرش، إلخ)، غلّف العمل بـ
lumi-context-pushوlumi-context-popحتى تُستعاد حالة المستخدم.