Elixir لغة ذات أنواع ديناميكية، أي أن نوع المتغير لا يُفحص إلا أثناء تنفيذ البرنامج. وباستخدام عامل المطابقة = يمكننا ربط قيمة من أي نوع باسم متغير:
# Bound an integer value of 1
count = 1
# You may re-bind variables
count = 2
# You may re-bind any type to a variable
count = false
# Strings can be created by enclosing characters within double quotes
message = "Success!"
Elixir لغة برمجة وظيفية تتطلب تعريف جميع الدوال المسماة داخل وحدة. وتُستخدم الكلمة المفتاحية defmodule لتعريف وحدة. جميع الوحدات متاحة لجميع الوحدات الأخرى في وقت التنفيذ، ولا تحتاج إلى معدِّل وصول لتجعلها مرئية لأجزاء أخرى من البرنامج. وتشبه الوحدة الصنف في لغات البرمجة الأخرى.
defmodule Calculator do
# ...
end
يجب تعريف الدوال المسماة داخل وحدة. وتُستخدم الكلمة المفتاحية def لتعريف دالة مسماة عامة.
يمكن أن تأخذ كل دالة صفرًا أو أكثر من الوسائط. وقيمة آخر تعبير في الدالة تُرجَع ضمنيًا دائمًا.
defmodule Calculator do
def add(x, y) do
x + y
end
end
لاستدعاء دالة، حدّد اسم وحدتها واسم الدالة، ومرّر وسيطًا لكل من وسائط الدالة.
sum = Calculator.add(1, 2)
# => 3
يمكن استخدام الكلمة المفتاحية defp بدلًا من def لتعريف دالة خاصة. ولا يمكن استخدام الدوال الخاصة إلا من داخل الوحدة نفسها التي عرّفتها.
عند استدعاء دالة من داخل الوحدة نفسها التي عُرّفت فيها، يمكن حذف اسم الوحدة.
يمكنك أيضًا كتابة دوال قصيرة باستخدام صيغة من سطر واحد (لاحظ الفاصلة , والنقطتين : حول الكلمة المفتاحية do).
defmodule Calculator do
def subtract(x, y) do
private_subtract(x, y)
end
defp private_subtract(x, y), do: x - y
end
difference = Calculator.subtract(7, 2)
# => 5
difference = Calculator.private_subtract(7, 2)
# => ** (UndefinedFunctionError) function Calculator.private_subtract/2 is undefined or private
# Calculator.private_subtract(7, 2)
من الشائع الإشارة إلى الدوال بـ_عدد الوسائط_. و_عدد الوسائط_ للدالة هو عدد الوسائط التي تقبلها.
# add/3 because this function has three arguments, thus an arity of 3
def add(x, y, z) do
x + y + z
end
يُفضّل أن تستخدم أسماء الوحدات PascalCase. ويجب أن يبدأ اسم الوحدة بحرف كبير A-Z، ويمكن أن يحتوي على حروف a-zA-Z وأرقام 0-9 وشرطات سفلية _.
يُفضّل أن تستخدم أسماء المتغيرات والدوال snake_case. ويجب أن يبدأ اسم المتغير أو الدالة بحرف صغير a-z أو شرطة سفلية _، ويمكن أن يحتوي على حروف a-zA-Z وأرقام 0-9 وشرطات سفلية _، وقد ينتهي بعلامة استفهام ? أو علامة تعجب !.
لدى Elixir مكتبة قياسية غنية جدًا وموثّقة جيدًا. التوثيق متاح على الإنترنت على hexdocs.pm/elixir. احفظ هذا الرابط في مكان ما، فستستخدمه كثيرًا!
لمعظم أنواع البيانات المدمجة وحدة مقابلة توفّر دوالًا للتعامل مع ذلك النوع، فعلى سبيل المثال هناك وحدة Integer للأعداد الصحيحة، ووحدة String للسلاسل النصية، ووحدة List للمصفوفات، وهكذا.
من الوحدات البارزة وحدة Kernel. فهي توفّر الإمكانات الأساسية التي بُنيت عليها بقية المكتبة القياسية، مثل عوامل العمليات الحسابية، وماكرو التحكم في سير البرنامج، وغيرها الكثير. وتُستورد دوال وحدة Kernel تلقائيًا، لذا يمكنك استخدامها دون البادئة Kernel..
يمكن استخدام التعليقات لترك ملاحظات لمطورين آخرين يقرؤون الكود المصدري. تُسبق التعليقات أحادية السطر في Elixir بالرمز #.
في هذا التمرين، ستكتب بعض الكود لمساعدتك في طهي لازانيا رائعة من كتاب الطبخ المفضل لديك.
لديك خمس مهام، كلها مرتبطة بالوقت المستغرق في طهي اللازانيا.
عرّف الدالة Lasagna.expected_minutes_in_oven/0 التي لا تأخذ أي وسائط وتُرجع عدد الدقائق التي ينبغي أن تبقى فيها اللازانيا في الفرن. وفقًا لكتاب الطبخ، فإن الزمن المتوقع للفرن بالدقائق هو 40:
Lasagna.expected_minutes_in_oven()
# => 40
عرّف الدالة Lasagna.remaining_minutes_in_oven/1 التي تأخذ الدقائق الفعلية التي قضتها اللازانيا في الفرن كوسيط وتُرجع عدد الدقائق التي لا يزال يتعين على اللازانيا البقاء فيها في الفرن، استنادًا إلى الزمن المتوقع للفرن بالدقائق من المهمة السابقة.
Lasagna.remaining_minutes_in_oven(30)
# => 10
عرّف الدالة Lasagna.preparation_time_in_minutes/1 التي تأخذ عدد الطبقات التي أضفتها إلى اللازانيا كوسيط وتُرجع عدد الدقائق التي استغرقتها في تحضير اللازانيا، بافتراض أن تحضير كل طبقة يستغرق منك دقيقتين.
Lasagna.preparation_time_in_minutes(2)
# => 4
عرّف الدالة Lasagna.total_time_in_minutes/2 التي تأخذ وسيطين: الوسيط الأول هو عدد الطبقات التي أضفتها إلى اللازانيا، والوسيط الثاني هو عدد الدقائق التي قضتها اللازانيا في الفرن. ينبغي أن تُرجع الدالة إجمالي عدد الدقائق التي عملتها في طهي اللازانيا، وهو مجموع زمن التحضير بالدقائق، والوقت بالدقائق الذي قضته اللازانيا في الفرن في تلك اللحظة.
Lasagna.total_time_in_minutes(3, 20)
# => 26
عرّف الدالة Lasagna.alarm/0 التي لا تأخذ أي وسائط وتُرجع رسالة تشير إلى أن اللازانيا جاهزة للأكل.
Lasagna.alarm()
# => "Ding!"
سجّل في Exercism لتتعلّم وتتقن Elixir عبر 58 مفهومًا168 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.