freeCodeCamp/guide/arabic/clojure/lists-are-everything/index.md

107 lines
6.6 KiB
Markdown
Raw Normal View History

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