---
title: Clojure Lists They Are Everything
localeTitle: قوائم كلوجور وهم كل شيء
---
القوائم هي أساسية ل Clojure. Clojure هو Lisp ، واستخدم Lisps في الأصل لمعالجة القوائم. كل شيء في اللسب هو قائمة!

 `(def foo "bar") 
` 

هذه القطعة من الكود هي في الواقع قائمة! كذلك أي شيء بين قوسين دائمين في Clojure. مثيرة للاهتمام ، أليس كذلك؟ هذا ما يجعل اللسبس ممتعًا للغاية - يمكنك بسهولة كتابة رمز يولد رمزًا جديدًا ، لأن إنشاء الشفرة بسيط مثل إنشاء قائمة.

## جعل قائمة فعلية

المشكلة ، لأن كل شيء هو قائمة في Clojure ، شيء من هذا القبيل سيؤدي إلى حدوث خطأ:

 `(1 2 3 4 5) 
 ; => ClassCastException java.lang.Long cannot be cast to clojure.lang.IFn 
` 

يا لها من رسالة خطأ فظيعة. ما يحاول الـ REPL إخبارنا به هو "1 ليست وظيفة ، ولا يمكن تحويلها إلى واحدة." لأن كل شيء في اللسب هو قائمة ، فإن أول عنصر في أي قائمة يتم التعامل معه كدالة ، مثل `def` أو `+` أو `str` ، لذلك إذا كتبنا `(1 2 3 4 5)` ، فإنه يعامل العنصر الأول ( `1` ) باعتباره وظيفة ، والتي من الواضح أنها ليست كذلك.

يمكننا حل هذا بطريقتين. أحدهما يستخدم دالة `list` لإنشاء قائمة ، مثل استخدام `str` لسَلسَلة السلاسل معاً.

 `(list 1 2 3 4 5) 
 ; => (1 2 3 4 5) 
` 

يمكنك أيضا استخدام الاقتباس. نقلا عن قائمة تقول أساسا إلى المجمع أن هذه القائمة _ليست_ مكالمة وظيفة ، وأنه لا ينبغي تقييم أي رمز داخلها.

 `'(1 2 3 4 5) 
 ; => (1 2 3 4 5) 
` 

من المثير للاهتمام ، يمكنك أيضا اقتبس المكالمات وظيفة. هذه هي الطريقة التي تعمل بها وحدات الماكرو. إنها معقدة إلى حد كبير ، وتستحق مقالها الخاص ، لذلك لن نتوسع في التفاصيل هنا.

 `;; Without a ' to quote it, this would return "foobarbaz". 
 '(str "foo" "bar" "baz") 
 ; => (str "foo" "bar" "baz") 
` 

![:rocket:](//forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=2 ":صاروخ:") [IDEOne ذلك!](https://ideone.com/6c7UxY)

## إضافة إلى قائمة

تم تصميم القوائم للإضافة ، بدلاً من الإلحاق. لا توجد وسيلة حقيقية لإلحاق قائمة. يمكنك الإضافة إلى قائمة باستخدام `cons` . يعمل `conj` أيضا ، ولكن هذا يعني للناقلات ، `cons` أسرع للقوائم.

 `(cons 1 '(2 3 4)) 
 ; => (1 2 3 4) 
` 

## استرجاع من القوائم

يمكنك استرداد العناصر من القوائم باستخدام `nth` . `get` لا يعمل على القوائم ، لأن القوائم مصممة للوصول التسلسلي ، بدلا من الوصول العشوائي. لاحظ أن `nth` يعمل على المتجهات ولكنه أبطأ من `get` هذا.

 `(nth '(1 2 3 4) 0) 
 ; => 1 
` 

## تحويل مجموعات أخرى إلى قوائم

لا تستطيع وظيفة `list` تحويل مجموعات أخرى إلى قوائم ، لأنها تحاول إنشاء قائمة باستخدام الحجج التي تم منحها. `list` التمرير ستقوم مجموعة بإرجاع قائمة تحتوي على تلك المجموعة.

 `(list [1 2 3 4 5]) 
 ; => ([1 2 3 4 5]) 
` 

للتحويل إلى قائمة ، استخدم الدالة `seq` بدلاً من ذلك.

 `(seq [1 2 3 4 5]) 
 ; => (1 2 3 4 5) 
` 

## تسلسل كسول

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

`range` ربما يكون أكثر تسلسل كسول. أنه يحتوي على جميع الأرقام.

 `(range 10) 
 ; => (0 1 2 3 4 5 6 7 8 9) 
 (range -5 5) 
 ; => (-5 -4 -3 -2 -1 0 1 2 3 4) 
` 

يمكنك استخدام تسلسلات كسولة للقيام بأشياء رائعة ، مثل توليد تسلسل كسول لجميع أرقام فيبوناتشي.

 `(def fibs 
     (lazy-cat [0 1] (map + (rest fibs) fibs))) 
 
 (take 10 fibs) ;; this means, "evaluate the first 10 fibonacci numbers." 
 ; => (0 1 1 2 3 5 8 13 21 34) 
` 

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

![:rocket:](//forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=2 ":صاروخ:") [IDEOne ذلك!](https://ideone.com/jwpvt8)

## متى تستخدم القائمة؟

يُفضّل استخدام المتجه عادةً استخدام قائمة ، لأنه لا يوجد خطر من قيام المترجم بتقييم المتجه كدالة بطريق الخطأ ، كما أنه أسرع في الوصول إلى العناصر التعسفية للمتجه. القوائم هي الأكثر فائدة في 3 حالات:

*   توليد كود باستخدام الماكرو.
*   توليد تسلسل كسول "اللانهائي".
*   إقراض العناصر إلى مجموعة.

| [![:point_left:](//forum.freecodecamp.com/images/emoji/emoji_one/point_left.png?v=2 ": point_left:") السابق](//forum.freecodecamp.com/t/clojure-collections/18411) [![:book:](//forum.freecodecamp.com/images/emoji/emoji_one/book.png?v=2 ":كتاب:") الصفحة الرئيسية ![:book:](//forum.freecodecamp.com/images/emoji/emoji_one/book.png?v=2 ":كتاب:")](//forum.freecodecamp.com/t/clojure-resources/18422) | [التالى ![:point_right:](//forum.freecodecamp.com/images/emoji/emoji_one/point_right.png?v=2 ": point_right:")](//forum.freecodecamp.com/t/clojure-vectors/18421) |  
| [مجموعات](//forum.freecodecamp.com/t/clojure-collections/18411) | [جدول المحتويات](//forum.freecodecamp.com/t/clojure-resources/18422) | [ناقلات](//forum.freecodecamp.com/t/clojure-vectors/18421) |