--- 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) |