الدوال المتغيرة

الدوال المتغيرة (variadic) في Scheme هي دوال تقبل عددًا متغيرًا من الوسائط. هذه الدوال متعددة الاستخدامات وتتيح إنشاء تعليمات برمجية مرنة وقابلة لإعادة الاستخدام. في البرمجة الوظيفية، تبسّط الدوال المتغيرة العمليات التي تحتاج معالجة عدد عشوائي من المدخلات، مثل جمع قائمة أرقام أو تسلسل سلاسل.

تكون الدوال المتغيرة مفيدة خصوصًا عندما:

  • لا يمكن تحديد عدد الوسائط مسبقًا.
  • تحتاج تطبيق نفس العملية على مدخلات ديناميكية.
  • تكتب أدوات مساعدة لتجميع البيانات أو تحويلها.

بناء جملة الدوال المتغيرة

تُعرَّف الدوال المتغيرة باستخدام الرمز . قبل اسم المعلمة الأخيرة. تجمع هذه المعلمة الأخيرة كل الوسائط المتبقية في قائمة.

(define (function-name fixed-parameters . variadic-parameter)
  body-expression)
  • fixed-parameters: أي وسائط ثابتة مطلوبة.
  • variadic-parameter: معلمة خاصة مسبوقة بـ . تجمع الوسائط الإضافية في قائمة.
  • body-expression: المنطق الذي يُنفَّذ عند استدعاء الدالة.

أمثلة على الدوال المتغيرة

دالة متغيرة أساسية

(define (sum . numbers)
  (apply + numbers))
  • شرح:
    • numbers يجمع كل الوسائط في قائمة.
    • apply يطبّق + على جميع عناصر القائمة.

الاستخدام:

(sum 1 2 3 4 5)  ; يرجع 15

دالة متغيرة بمعلمات ثابتة

يمكن الجمع بين معلمات ثابتة ومتغيرة لدوال أكثر مرونة.

(define (greet prefix . names)
  (map (lambda (name) (string-append prefix " " name)) names))
  • شرح:
    • prefix وسيطة ثابتة.
    • names يجمع الوسائط المتبقية في قائمة.
    • كل اسم يُسبَق بالسلسلة المحددة باستخدام map وlambda.

الاستخدام:

(greet "Hello" "Alice" "Bob" "Charlie")  ; يرجع ("Hello Alice" "Hello Bob" "Hello Charlie")

الجمع بين منطق ثابت ومتغير

(define (describe-collection collection-name . items)
  (string-append collection-name ": " (string-join items ", ")))
  • شرح:
    • collection-name معلمة ثابتة.
    • items يجمع وسائط إضافية في قائمة.
    • الدالة تسلسل اسم المجموعة والعناصر في سلسلة واحدة.

الاستخدام:

(describe-collection "Fruits" "Apple" "Banana" "Cherry")
; يرجع "Fruits: Apple, Banana, Cherry"

حالات استخدام متقدمة

معالجة مدخلات تعسفية

تتفوق الدوال المتغيرة في التعامل مع بيانات تعسفية. مثال لجمع الأرقام الموجبة فقط:

(define (sum-positive . numbers)
  (apply + (filter (lambda (x) (> x 0)) numbers)))
  • تصفية الأرقام غير الموجبة قبل الجمع.

الاستخدام:

(sum-positive -5 3 7 -2 8)  ; يرجع 18

دوال متغيرة بمنطق عودي

(define (max-value first . rest)
  (if (null? rest)
      first
      (max first (apply max rest))))
  • شرح:
    • first تعالج الوسيطة الأولى.
    • rest يجمع الوسائط المتبقية في قائمة.
    • تحسب القيمة القصوى بشكل عودي.

الاستخدام:

(max-value 10 20 5 40 15)  ; يرجع 40

فوائد الدوال المتغيرة

  • المرونة: تتعامل مع مجموعة واسعة من حالات الإدخال.
  • الإيجاز: تقلّل الحاجة إلى دوال متعددة متشابهة.
  • عمليات ديناميكية: تمكّن معالجة بيانات وقت التشغيل دون معرفة عدد الوسائط مسبقًا.

متى تستخدم الدوال المتغيرة

استخدمها عندما:

  • تحتاج الدالة معالجة عدد غير معروف من الوسائط.
  • تنطبق عملية واحدة على جميع المدخلات (جمع، تسلسل، تعيين، إلخ).
  • تبسّط منطقًا ذا ترتيب أعلى بوسائط ديناميكية.

تجنّبها عندما:

  • التحقق من صحة الإدخال أو النوع معقد.
  • الوسائط الثابتة تكفي للمنطق المطلوب.
  • تتعرض إمكانية القراءة للخطر بسبب عمليات معقدة جدًا.

خاتمة

توفر الدوال المتغيرة في Scheme آلية قوية للتعامل مع مدخلات ديناميكية. بفهم بنائها واستخدامها، يمكنك إنشاء نصوص مرنة وقوية تتكيف مع سيناريوهات مختلفة. إلى جانب الدوال ذات الترتيب الأعلى، تجعل الدوال المتغيرة تعليماتك البرمجية أكثر إيجازًا وتعبيرًا.