تُعامل الدوال كمواطنين من الدرجة الأولى في 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.
نفّذ Secrets.secret_add/1. يجب أن تُرجع دالة تأخذ وسيطًا واحدًا وتضيف إليه الوسيط المُمرَّر إلى secret_add.
adder = Secrets.secret_add(3)
adder.(2)
# => 5
نفّذ Secrets.secret_subtract/1. يجب أن تُرجع دالة تأخذ وسيطًا واحدًا وتطرح السر المُمرَّر إلى secret_subtract من ذلك الوسيط.
subtractor = Secrets.secret_subtract(2)
subtractor.(3)
# => 1
نفّذ Secrets.secret_multiply/1. يجب أن تُرجع دالة تأخذ وسيطًا واحدًا وتضربه في السر المُمرَّر إلى secret_multiply.
multiplier = Secrets.secret_multiply(7)
multiplier.(3)
# => 21
نفّذ Secrets.secret_divide/1. يجب أن تُرجع دالة تأخذ وسيطًا واحدًا وتقسمه على السر المُمرَّر إلى secret_divide.
divider = Secrets.secret_divide(3)
divider.(32)
# => 10
استخدم القسمة الصحيحة حتى يكون الناتج متوافقًا مع المُدخل المتوقع للدوال الأخرى.
and
نفّذ Secrets.secret_and/1. يجب أن تُرجع دالة تأخذ وسيطًا واحدًا وتُجري عليه عملية and البتية مع السر المُمرَّر إلى secret_and.
ander = Secrets.secret_and(1)
ander.(2)
# => 0
xor
نفّذ Secrets.secret_xor/1. يجب أن تُرجع دالة تأخذ وسيطًا واحدًا وتُجري عليه عملية xor البتية مع السر المُمرَّر إلى secret_xor.
xorer = Secrets.secret_xor(1)
xorer.(3)
# => 2
نفّذ 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
سجّل في Exercism لتتعلّم وتتقن Elixir عبر 58 مفهومًا168 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.