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

6.6 KiB

title localeTitle
Clojure Lists They Are Everything قوائم كلوجور وهم كل شيء

القوائم هي أساسية ل 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: IDEOne ذلك!

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

تم تصميم القوائم للإضافة ، بدلاً من الإلحاق. لا توجد وسيلة حقيقية لإلحاق قائمة. يمكنك الإضافة إلى قائمة باستخدام 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: IDEOne ذلك!

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

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

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

| :point_left: السابق :book: الصفحة الرئيسية :book: | التالى :point_right: |
| مجموعات | جدول المحتويات | ناقلات |