
_START_ARTICLE_
كلوجر (لغة برمجة)
_START_SECTION_
الفلسفة
_START_PARAGRAPH_
وضع (ريتش هيكي) لغة كلوچر لأنه أراد لغة ليسب حديثة للـ برمجة وظيفية تتوافق مع جافا (منصة برمجية) وتم تصميمها لتحقيق التزامن._NEWLINE_يتسم أسلوب لغة كلوچر في تحقيق التزامن بمفهوم الهويات, الذي يُمثل سلسلة من الحالات الثابتة مع مرور الوقت. وبما أن الحالات قيم ثابتة لا تتغير فيمكن أن يعمل عليها أي عدد من العاملين في نفس الوقت ويُصبح التزامن مسألة إدارة التغيرات من حالة إلي أخرى. لهذا الغرض تتيح لغة كلوچر العديد من أنواع المراجع المتغيرة لكل منها معاني محددة جيدا للانتقال بين الحالات.
_START_SECTION_
البنية
_START_PARAGRAPH_
مثل غيرها من لغات ليسب فإن بنية اللغة كلوچر قائمة علي اللغات الرمزية S-expressions التي يتم تحليلها أولا إلي هياكل بيانات بواسطة قارئ قبل تجميعها. يدعم قارئ لغة كلوچر البنية النصية للخرائط والمجموعات والمتجهات بالإضافة إلي القوائم. ثم يتم إعطاء كل ذلك إلي المُجمع كما هي. بمعني آخر لا يقوم جامع لغة كلوچر بجمع هياكل البيانات فقط ولكنه يدعم كل الأنواع المذكورة مباشرة. لغة كلوچر هي لغة ليسب-1 وليس المقصود منها أن تتوافق من ناحية الشفرة مع لهجات ليسب الأخرى.
_START_SECTION_
الماكرو
_START_PARAGRAPH_
ماكرو لغة كلوچر يشبه كثيرا الماكرو الخاص بلغة ليسب العادية ماعدا أن في لغة كلوچر فإن الفاصلة العليا المائلة (التي تسمي الفاصلة البنائية تصف الرموز بحيزها الاسمي. يساعد ذلك علي منع إتخاذ الأسماء غير المقصودة كارتباط بالأسماء المؤهل حيزها الاسمي. من الممكن إجبار حصر بيانات امتداد الماكرو ولكن يجب أن يتم ذلك بوضوح. كما أن لغة كلوچر لا تسمح بإعادة ارتباط الأسماء العالمية في حيز اسمي آخر تم استيراد بياناته إلي الحيز الاسمي الحالي.
_START_SECTION_
أمثلة
_START_PARAGRAPH_
برنامج_أهلا_بالعالم:_NEWLINE_ (println "Hello, world!")_NEWLINE_مولد خيط آمن من أعداد متسلسلة فريدة:_NEWLINE_ (javax.swing.JOptionPane/showMessageDialog nil "Hello World")_NEWLINE_فئة فرعية مجهولة من كاتي جافا آى أو والتي لا تكتب علي أي شيء والماكرو يستخدم ذلك لإسكات كافة المطبوعات بداخله:_NEWLINE_ (let [i (atom 0)]_NEWLINE_  (defn generate-unique-id_NEWLINE_    "Returns a distinct numeric ID for each call."_NEWLINE_    []_NEWLINE_    (swap! i inc)))_NEWLINE_فئة فرعية مجهولة من java.io.Writer that والتي لا تكتب علي أي شيء والماكرو يستخدم ذلك لإسكات كافة المطبوعات بداخله:_NEWLINE_ (def bit-bucket-writer_NEWLINE_  (proxy [java.io.Writer] []_NEWLINE_    (write [buf] nil)_NEWLINE_    (close []    nil)_NEWLINE_    (flush []    nil)))_NEWLINE_ (defmacro noprint_NEWLINE_  "Evaluates the given expressions with all printing to *out* silenced."_NEWLINE_  [& forms]_NEWLINE_  `(binding [*out* bit-bucket-writer]_NEWLINE_     ~@forms))_NEWLINE_ (noprint_NEWLINE_ (println "Hello, nobody!"))_NEWLINE_10 خيوط تستخدم هيكل بيانات مشترك واحد يتكون من 100 متجه يحتوي كل منها عي 10 أعداد فريدة (متتابعة أولياً). يتكرر اختيار كل خيط لموضعين عشوائيين في متجهين عشوائيين ويقوم بتبديلهما. كافة التغييرات علي المتجهات تحدث في التعاملات عن طريق الاستفادة من نظام ذاكرة أعمال البرمجيات الخصة بلغة كلوچر, ولهذا السبب فإنه حتي بعد 100.000 تكرار لكل خيط، لا يضيع أي حرف._NEWLINE_ (defn run [nvecs nitems nthreads niters]_NEWLINE_  (let [vec-refs (vec (map (comp ref vec)_NEWLINE_                           (partition nitems (range (* nvecs nitems)))))_NEWLINE_        swap #(let [v1 (rand-int nvecs)_NEWLINE_                    v2 (rand-int nvecs)_NEWLINE_                    i1 (rand-int nitems)_NEWLINE_                    i2 (rand-int nitems)]_NEWLINE_                (dosync_NEWLINE_                 (let [temp (nth @(vec-refs v1) i1)]_NEWLINE_                   (alter (vec-refs v1) assoc i1 (nth @(vec-refs v2) i2))_NEWLINE_                   (alter (vec-refs v2) assoc i2 temp))))_NEWLINE_        report #(do_NEWLINE_                 (prn (map deref vec-refs))_NEWLINE_                 (println "Distinct:"_NEWLINE_                          (count (distinct (apply concat (map deref vec-refs))))))]_NEWLINE_    (report)_NEWLINE_    (dorun (apply pcalls (repeat nthreads #(dotimes [_ niters] (swap)))))_NEWLINE_    (report)))_NEWLINE_ (run 100 10 10 100000)_NEWLINE_مخرجات المثال السابق:_NEWLINE_ ([0 1 2 3 4 5 6 7 8 9] [10 11 12 13 14 15 16 17 18 19]..._NEWLINE_ [990 991 992 993 994 995 996 997 998 999])Distinct: 1000_NEWLINE_  ([382 318 466 963 619 22 21 273 45 596] [808 639 804 471 394 904 952 75 289 778]..._NEWLINE_ [484 216 622 139 651 592 379 228 242 355])Distinct: 1000