freeCodeCamp/guide/arabic/clojure/index.md

6.4 KiB

title localeTitle
Clojure كلوجر

الابتداء مع Clojure

قبل أن نبدأ ، قد ترغب في تثبيت Clojure و Leiningen (وهي أداة لإدارة المشاريع في Clojure). سيسمح لك هذا بتشغيل Clojure في سطر الأوامر باستخدام REPL (قراءة - تقييم - تكرار - حلقة).

تعريف المتغيرات

الخبز والزبدة لأي لغة برمجة هي متغيرات ووظائف. دعونا تحديد المتغير!

(def our-string "Hello world!")

سهل جدا. يستخدم هذا الجزء من التعليمات البرمجية الماكرو def لربط سلسلة ( "Hello world!" ) إلى رمز ( our-string ). يمكننا أيضًا تحديد رقم ، مثل 1 أو 1.1 ، أو حرف ، مثل \a أو \Z ، أو شيء أكثر تعقيدًا مثل قائمة أو تعبير عادي ( uuuugh ).

لاحظ أن الكود الخاص بنا موجود داخل أقواس ، مثل قائمة ، لأن كل شيء موجود في اللسب هو قائمة! (سيكون ذلك مهمًا جدًا عندما نبدأ الحديث عن وحدات الماكرو).

تحديد وظائف

الآن ، دعونا تحديد وظيفة!

(defn hello-world [] (println our-string))

هذا أكثر تعقيدًا بعض الشيء. مثل def ، فإنه يستخدم الماكرو ( defn ) لإنشاء متغير - على الرغم من هذه المرة ، هذا المتغير هو وظيفة. المتجه الفارغ (المتجه هو نوع من القائمة - فكر فيه كصفيف) بعد أن يحدد hello-world الحجج لتلك الوظيفة - في هذه الحالة ، ليس لدينا أي. الرمز بعد ذلك هو ما تقوم به الوظيفة. يقوم بتقييم our-string ، والتي تساوي "Hello world!" ، وطباعته إلى وحدة التحكم. دعونا تشغيلها!

(hello-world) ; => Hello world! ; nil

يمكنك أيضًا كتابة هذا:

(def hello-world (fn [] (println our-string)))

defn هو مجرد اختصار للمساعدة في الحفاظ على التعليمات البرمجية الخاصة بك موجزة. (defn ...) و (def ... (fn ...)) هي نفسها في الممارسة.

المعلمات

حسنًا ، كان ذلك لطيفًا ، لكنه لم يكن مثيرًا حقًا. دعونا نحاول وظيفة مع المعلمات. ماذا عن واحد يضيف 3 أرقام؟

(defn add [xyz] (+ xyz)) (add 1 2 3) ; => 6

…انتظر. (+ xyz) ؟ هذا يبدو مضحكا. حسنا ، يتم كتابة Lisps باستخدام "تدوين البادئة" ، مما يعني أن الوظيفة تأتي دائما في المقام الأول. نظرًا لأن جميع العوامل الرياضية في Lisp ( + - * / ) هي مجرد وظائف ، فإنها تأتي أيضًا قبل حججها (في هذه الحالة ، xyz ).

ستلاحظ أن متجهنا لديه بعض الأشياء فيه الآن: [xyz] ! عندما تحتوي الدالة على معلمات ، تقوم بتعريفها في هذا المتجه بجوار اسم الدالة.

الإتلاف

وهناك ميزة كبيرة حول الحجج في Clojure هي تدمير. يتيح لك إمكانية سحب العناصر من قائمة.

(defn add [[xy] z] (+ xyz)) (add [1 2] 3) ; => 6

:rocket: IDEOne ذلك!

الوسيطات لهذه الوظيفة هي مجموعة ( [xy] ) ورقم ( z ). يمكننا استخدام عملية التدمير لسحب العناصر الأولى والثانية من القائمة ، وسنطلق عليها x و y .

وظائف مع أي عدد من المعلمات

يمكنك أيضًا تحديد وظيفة ذات عدد تعسفي من الوسيطات باستخدام & .

(defn demonstrate-rest [first & rest] (println first) (println rest)) (demonstrate-rest 1 "foo" ["bar" 22]) ; => 1 ; ("foo" ["bar" 22]) ; nil

:rocket: IDEOne ذلك!

كما ترون ، استخدم & فصل حجج الدالة الخاصة بنا إلى متغير واحد يسمى first وقائمة المتغيرات تسمى rest . هذا يعني أن وظيفتنا يمكن أن يكون لها أي عدد من الحجج!

عودة

ربما لاحظت بعض الأشياء الغريبة. عندما نستخدم println ، يبدو أن nil يظهر في مخرجاتنا. علاوة على ذلك ، ترجع الدالة add 6 ، ولكننا لم نخبرها أبداً بإعادة أي شيء.

في Clojure ، تكون العوائد "ضمنية". إذا كنت قد استخدمت روبي ، فأنت على الأرجح على دراية بهذا المفهوم. وبدلاً من إخبارنا عن وظيفتنا لإعادة شيء ما ، فإنه يقيّم جميع الشفرات داخل جسمه ، ويعيد النتيجة. تقوم وظيفة add لدينا ، على سبيل المثال ، بتقييم (+ xyz) ، ثم تقوم بإرجاع تلك النتيجة.

السبب في وظائفنا التي تستخدم إخراج println nil لأنه يتم تقييم println إلى nil . ( nil مثل null أو None - إنه لا يمثل أي شيء).

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