القوائم نوع بيانات أساسي في Elixir لتخزين مجموعة من القيم. القوائم غير قابلة للتغيير، بمعنى أنه لا يمكن تعديلها. أي عملية تُغيّر قائمة ما تُرجع قائمة جديدة. وتُطبّق القوائم بروتوكول Enumerable، ما يتيح استخدام الدوال في وحدتي Enum وStream.
تُنفَّذ القوائم في Elixir على هيئة قوائم مترابطة، لا كمصفوفات من مواقع ذاكرة متجاورة. لذلك يستغرق الوصول إلى عنصر في القائمة وقتًا خطيًا يتوقف على طول القائمة.
يمكن كتابة القوائم بالصيغة الحرفية، أو بترميز الرأس والذيل (الذي يستخدم عامل cons وهو |)، أو بمزيج من الاثنين:
# Literal Form
[]
[1]
[1, 2, 3]
# Head-tail Notation
[]
# same as [1]
[1 | []]
# same as [1, 2, 3]
[1 | [2 | [3 | []]]]
# Mixed
# same as [1, 2, 3]
[1 | [2, 3]]
وقد يكون هناك أكثر من عنصر واحد قبل العامل cons (|).
# Multiple prepends
[1, 2, 3 | [4, 5]]
يمكن استخدام ترميز الرأس والذيل لإضافة عناصر إلى نهاية القائمة.
list = [2, 1]
[3, 2, 1] == [3 | list]
# => true
تُعدّ إضافة العناصر إلى نهاية القائمة أثناء التكرار نمطًا مضادًا. فإضافة عنصر تتطلب المرور على القائمة كاملة وإضافة العنصر في نهايتها؛ لذلك فإن إضافة عنصر جديد في كل تكرار تتطلب المرور على القائمة كاملة في كل مرة.
ويمكننا تحقيق النتيجة نفسها بإضافة العنصر إلى مقدمة القائمة المعكوسة، ثم عكس الناتج. فالإضافة إلى المقدمة عملية سريعة وتتطلب وقتًا ثابتًا.
# Appending to the end of a list (potentially slow)
[1, 2, 3] ++ [4] ++ [5] ++ [6]
# Prepend to the start of a list (faster, due to the nature of linked lists)
[6 | [5 | [4 | [3, 2, 1]]]]
# then reverse!
وهناك عدة دوال شائعة في Kernel تخص القوائم:
hd/1 رأس القائمة، أي العنصر الأول فيها.tl/1 ذيل القائمة، أي القائمة من دون العنصر الأول.length/1 عدد العناصر في القائمة.in/2 قيمة منطقية تحدد ما إذا كان العنصر موجودًا في القائمة.وهناك أيضًا وحدة List.
يمكن أن تحتوي القوائم على أي نوع بيانات، وعلى مزيج من أنواع بيانات مختلفة.
list = [1, :a, 2.0, "string"]