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
الوسيطات لهذه الوظيفة هي مجموعة ( [xy]
) ورقم ( z
). يمكننا استخدام عملية التدمير لسحب العناصر الأولى والثانية من القائمة ، وسنطلق عليها x
و y
.
وظائف مع أي عدد من المعلمات
يمكنك أيضًا تحديد وظيفة ذات عدد تعسفي من الوسيطات باستخدام &
.
(defn demonstrate-rest [first & rest] (println first) (println rest)) (demonstrate-rest 1 "foo" ["bar" 22]) ; => 1 ; ("foo" ["bar" 22]) ; nil
كما ترون ، استخدم &
فصل حجج الدالة الخاصة بنا إلى متغير واحد يسمى first
وقائمة المتغيرات تسمى rest
. هذا يعني أن وظيفتنا يمكن أن يكون لها أي عدد من الحجج!
عودة
ربما لاحظت بعض الأشياء الغريبة. عندما نستخدم println
، يبدو أن nil
يظهر في مخرجاتنا. علاوة على ذلك ، ترجع الدالة add
6
، ولكننا لم نخبرها أبداً بإعادة أي شيء.
في Clojure ، تكون العوائد "ضمنية". إذا كنت قد استخدمت روبي ، فأنت على الأرجح على دراية بهذا المفهوم. وبدلاً من إخبارنا عن وظيفتنا لإعادة شيء ما ، فإنه يقيّم جميع الشفرات داخل جسمه ، ويعيد النتيجة. تقوم وظيفة add
لدينا ، على سبيل المثال ، بتقييم (+ xyz)
، ثم تقوم بإرجاع تلك النتيجة.
السبب في وظائفنا التي تستخدم إخراج println
nil
لأنه يتم تقييم println
إلى nil
. ( nil
مثل null
أو None
- إنه لا يمثل أي شيء).
| السابق الصفحة الرئيسية | التالى |
| ملخص | جدول المحتويات | شرطي |