الأسرار

الأسرار

تمرين تعلّمي

مقدمة

الدوال المجهولة

تُعامل الدوال كمواطنين من الدرجة الأولى في Elixir. هذا يعني أن:

  • يمكن إسناد الدوال المسماة والمجهولة إلى المتغيرات.
  • يمكن تمرير الدوال المسماة والمجهولة كبيانات كوسائط وقيم إرجاع.
  • يمكن إنشاء الدوال المجهولة ديناميكياً.

على عكس الدوال المسماة، لا يتوفر للدوال المجهولة مرجع ثابت؛ فهي متاحة فقط إذا أُسندت إلى متغير أو استُدعيت فوراً.

قد نستخدم الدوال المجهولة من أجل:

  • إخفاء البيانات باستخدام النطاق المعجمي (المعروف أيضاً باسم الإغلاق).
  • إنشاء دوال ديناميكياً أثناء وقت التشغيل.

تبدأ الدوال المجهولة بالكلمة المحجوزة fn، وتُفصل الوسائط عن جسم الدالة بالرمز ->، وتُنهى بـ end. وكما في الدوال المسماة، تُرجع الدالة آخر تعبير فيها ضمنياً إلى الدالة المستدعية.

لاستدعاء مرجع دالة، يجب استخدام . بين متغير المرجع وقائمة الوسائط:

function_variable = fn param ->
  param + 1
end

function_variable.(1)
# => 2

يمكنك حتى استخدام صيغة الالتقاط المختصرة لجعل هذا أكثر إيجازاً:

variable = &(&1 + 1)

variable.(1)
# => 2

التعامل مع البتات

يدعم Elixir العديد من الدوال للتعامل مع البتات الموجودة في وحدة Bitwise.

  • band/2: العطف البتّي
  • bsl/2: الإزاحة لليسار
  • bsr/2: الإزاحة لليمين
  • bxor/2: الاستبعاد البتّي
  • bor/2: الفصل البتّي
  • bnot/1: النفي البتّي

إليك مثالاً على كيفية استخدام دالة بتّية:

Bitwise.bsl(1, 3)
# => 8

جميع الدوال البتّية تعمل على الأعداد الصحيحة فقط.

إذا كنت تستخدم Elixir إصدار 1.9 أو أقدم، فستحتاج إلى استدعاء require Bitwise في بداية تعريف الوحدة لتتمكن من استخدام وحدة Bitwise.

التعليمات

في هذا التمرين، مهمتك كتابة البرمجيات لجهاز تشفير يعمل بإجراء تحويلات على البيانات. وتحتاج إلى أسلوب يتيح لك إنشاء دوال معقدة بمرونة عبر دمج دوال أبسط معًا.

لكل مهمة، أرجِع دالة مجهولة يمكن استدعاؤها من نطاق الاستدعاء.

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

1. أنشئ دالة جمع

نفّذ Secrets.secret_add/1. يجب أن تُرجع دالة تأخذ وسيطًا واحدًا وتضيف إليه الوسيط المُمرَّر إلى secret_add.

adder = Secrets.secret_add(3)
adder.(2)
# => 5

2. أنشئ دالة طرح

نفّذ Secrets.secret_subtract/1. يجب أن تُرجع دالة تأخذ وسيطًا واحدًا وتطرح السر المُمرَّر إلى secret_subtract من ذلك الوسيط.

subtractor = Secrets.secret_subtract(2)
subtractor.(3)
# => 1

3. أنشئ دالة ضرب

نفّذ Secrets.secret_multiply/1. يجب أن تُرجع دالة تأخذ وسيطًا واحدًا وتضربه في السر المُمرَّر إلى secret_multiply.

multiplier = Secrets.secret_multiply(7)
multiplier.(3)
# => 21

4. أنشئ دالة قسمة

نفّذ Secrets.secret_divide/1. يجب أن تُرجع دالة تأخذ وسيطًا واحدًا وتقسمه على السر المُمرَّر إلى secret_divide.

divider = Secrets.secret_divide(3)
divider.(32)
# => 10

استخدم القسمة الصحيحة حتى يكون الناتج متوافقًا مع المُدخل المتوقع للدوال الأخرى.

5. أنشئ دالة للعملية البتية and

نفّذ Secrets.secret_and/1. يجب أن تُرجع دالة تأخذ وسيطًا واحدًا وتُجري عليه عملية and البتية مع السر المُمرَّر إلى secret_and.

ander = Secrets.secret_and(1)
ander.(2)
# => 0

6. أنشئ دالة للعملية البتية xor

نفّذ Secrets.secret_xor/1. يجب أن تُرجع دالة تأخذ وسيطًا واحدًا وتُجري عليه عملية xor البتية مع السر المُمرَّر إلى secret_xor.

xorer = Secrets.secret_xor(1)
xorer.(3)
# => 2

7. أنشئ دالة لدمج الدوال

نفّذ Secrets.secret_combine/2. يجب أن تُرجع دالة تأخذ وسيطًا واحدًا وتطبّق عليه الدالتين المُمرَّرتين إلى secret_combine بالترتيب.

add_one = Secrets.secret_add(1)
multiply_by_2 = Secrets.secret_multiply(2)
combined = Secrets.secret_combine(add_one, multiply_by_2)

combined.(3)
# => 8
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Elixir Exercism

مستعد لبدء الأسرار؟

سجّل في Exercism لتتعلّم وتتقن Elixir عبر 58 مفهومًا168 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.