انتقل إلى المحتوى

برمجة كلوجر

من ويكي الكتب

كلوجر هي لغة دالية (Functional) و هو توجه أكاديمي حتى وقت قريب حيث أن التوجه الذي يحكم السوق هو توجه اللغات كائنية التوجه(Object Oriented) مثل جافا و C#. - تواجدت بعض اللغات الدالية منذ وقت طويل مثل Haskell و اللغة القديمة قدم C و هي Lisp و لكن لم يكتب لهم النجاح في عالم الشركات حتى وقت قريب بالرغم من تميز هذه اللغات. - في الوقت الحالي بدأت اللغات الدالية بالعودة للساحة من جديد في صورة أو أخرى مثل Scala, F#, Clojure, Haskell, scheme, python, ruby مع الاعتراف بأن بعض هذه اللغات يملك قابلية الكتابة بمنهجي الدالية و كائنية التوجه. - حتى أن اللغات العتيدة في مسألة كائنية التوجه أضيف لها بعض من خصائص اللغات الدالية مثل ما حدث مع C# 4 و ما سيحدث مع Java 7 and 8.

- Clojure هي نكهة من نكهات Lisp و Lisp هي لغة قديمة قوية جميلة لكنها أبداً لم تصبح توجه عام بالنسبة للمبرمجين رغم أنها الاختيار الأول لكتابة برامج الذكاء الاصطناعي و من المبادئ البسيطة ل Lisp و التي ورثتها Clojure عنها هي أن شفرة البرنامج نفسها تعتبر معلومات "Code as Data" و لذلك تحاط جميع أكواد Clojure بأقواس لأن كل جملة من أكواد Clojure تعتبر List.

- سنفترض معرفتك بجافا .. إذن أنت معتاد على كود بهذا الشكل:

myObj.doSomething(anArg);

مع Clojure نفس الكود سيكتب بهذا الشكل:

(do-something my-obj an-arg)

و هذا يدعى prefix notation. - كما تلاحظ فإن الكود محاط بأقواس (و هذا ربما العيب الوحيد الذي يؤخذ على Clojure و من قبلها Lisp لكثرة الأقواس الناتجة من الكتابة). - مثال آخر على ال prefix notation:

(+ 2 3)

- نلاحظ أن علامة الجمع في بداية الدالة لأنها هي نفسها الدالة و الرقمين بعدها هما معطيات الدالة.   ما الذي ستحصل عليه مع Clojure:

-	closures
-	List comprehension
-	Software Transactional Memory 
-	Lazy sequence
-	Code as Data
-	Immutable data structures
-	 Dynamicity
-	Macros

  أنواع البيانات في Clojure:

-	Arbitrary precision integers - 12345678987654
-	Doubles 1.234 , BigDecimals 1.234M
-	Ratios - 22/7
-	Strings - fred , Characters - \a \b \c
-	Symbols - fred ethel , Keywords - :fred :ethel
-	Booleans - true false , Null  nil
-	Regex patterns #a*b
هيكلة البيانات في
 Lists - singly linked, grow at front
(1 2 3 4 5), (fred ethel lucy), (list 1 2 3)

 Vectors - indexed access, grow at end
[1 2 3 4 5], [fred ethel lucy]

 Maps - key/value associations
{:a 1, :b 2, :c 3}, {1 ethel 2 fred}

 Sets #{fred ethel lucy}

 Everything Nests

مثال للكود و شكله:

هذا الكود لعمل نافذة بمساحة 300*300 بيكسل مع زر و مربع نص و عنوان.

(import '(javax.swing JFrame JPanel JLabel JButton JTextArea))

(doto (JFrame. "Test") 
        (.setContentPane (doto (JPanel.) 
      (.setSize 300 300) 
      (.add (JLabel. "Label 1")) 
      (.add (JTextArea. ))
      (.add (JButton. "Click"))))
  .pack
  (.setVisible true)
  (.setDefaultCloseOperation JFrame/DISPOSE_ON_CLOSE))