القوائم مدمجة في لغة Elixir. وتُعتبر نوعًا أساسيًا، يُشار إليها بالأقواس المربعة. قد تكون القوائم فارغة أو تحتوي على أي عدد من العناصر من أي نوع. على سبيل المثال:
empty_list = []
one_item_list = [1]
two_item_list = [1, 2]
multiple_type_list = [1, :pi, 3.14, "four"]
تطبّق Elixir القوائم كقائمة مترابطة، حيث تخزّن كل عقدة قيمتين: العنصر الأول وقائمة أخرى تضم كل العناصر المتبقية. يُشار إلى العنصر الأول في القائمة باسم الرأس، وتسمى قائمة العناصر المتبقية الذيل. يمكننا استخدام هذا التدوين في الكود:
# [1] represented in [head | tail] notation
[1 | []]
# [1, 2, 3] represented in [head | tail] notation
[1 | [2 | [3 | []]]]
يمكننا استخدام التدوين [head | tail] لإضافة عناصر إلى مقدمة القائمة:
# Suppose
list = [2, 1]
[3, 2, 1] == [3 | list]
# => true
توجد عدة دوال في وحدة Kernel للتعامل مع القوائم، بالإضافة إلى وحدة List بأكملها.
# Check if 1 is a member of the list
1 in [1, 2, 3, 4]
# => true
في هذا التمرين عليك تنفيذ بعض الدوال للتعامل مع قائمة من لغات البرمجة.
عرّف الدالة new/0 التي لا تأخذ أي وسائط وتُرجع قائمة فارغة.
LanguageList.new()
# => []
عرّف الدالة add/2 التي تأخذ وسيطين (_قائمة لغات_ وسلسلة نصية حرفية تمثل لغة). يجب أن تُرجع القائمة الناتجة مع إضافة اللغة الجديدة إلى مقدمة القائمة المعطاة.
language_list = LanguageList.new()
# => []
language_list = LanguageList.add(language_list, "Clojure")
# => ["Clojure"]
language_list = LanguageList.add(language_list, "Haskell")
# => ["Haskell", "Clojure"]
عرّف الدالة remove/1 التي تأخذ وسيطًا واحدًا (_قائمة لغات_). يجب أن تُرجع القائمة دون العنصر الأول. افترض أن القائمة تحتوي دائمًا على عنصر واحد على الأقل.
language_list = LanguageList.new()
# => []
language_list = LanguageList.add(language_list, "Clojure")
# => ["Clojure"]
language_list = LanguageList.add(language_list, "Haskell")
# => ["Haskell", "Clojure"]
language_list = LanguageList.remove(language_list)
# => ["Clojure"]
عرّف الدالة first/1 التي تأخذ وسيطًا واحدًا (_قائمة لغات_). يجب أن تُرجع أول لغة في القائمة. افترض أن القائمة تحتوي دائمًا على عنصر واحد على الأقل.
language_list = LanguageList.new()
# => []
language_list = LanguageList.add(language_list, "Elm")
# => ["Elm"]
language_list = LanguageList.add(language_list, "Prolog")
# => ["Prolog", "Elm"]
LanguageList.first(language_list)
# => "Prolog"
عرّف الدالة count/1 التي تأخذ وسيطًا واحدًا (_قائمة لغات_). يجب أن تُرجع عدد اللغات في القائمة.
language_list = LanguageList.new()
# => []
language_list = LanguageList.add(language_list, "Elm")
# => ["Elm"]
language_list = LanguageList.add(language_list, "Prolog")
# => ["Prolog", "Elm"]
LanguageList.count(language_list)
# => 2
عرّف الدالة functional_list?/1 التي تأخذ وسيطًا واحدًا (_قائمة لغات_). يجب أن تُرجع قيمة منطقية. يجب أن تُرجع صحيحًا إذا كانت "Elixir" إحدى اللغات في القائمة.
language_list = LanguageList.new()
# => []
language_list = LanguageList.add(language_list, "Elixir")
# => ["Elixir"]
LanguageList.functional_list?(language_list)
# => true
سجّل في Exercism لتتعلّم وتتقن Elixir عبر 58 مفهومًا168 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.