107 lines
6.6 KiB
Markdown
107 lines
6.6 KiB
Markdown
|
---
|
||
|
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) |
|