44 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			44 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | |||
|  | title: What Is Clojure | |||
|  | localeTitle: ما هو كلوور | |||
|  | --- | |||
|  | ## Clojure هي لهجة من Lisp.
 | |||
|  | 
 | |||
|  | Lisps هي عائلة منفصلة تمامًا من اللغات إلى لغات C-like مثل C # أو Javascript أو Python أو Ruby. هذا يعني أن ليزبس قد تبدو غريبة بالنسبة للمبرمجين الذين هم أكثر دراية بهذه اللغات. أساسا ، كونه لسب يعني أن كل شيء في Clojure هو عبارة عن قائمة تحتوي على بيانات (حتى مكالمات الدالة!) ، فإنه يحتوي على كتابة ديناميكية ، ويمكنك تحديد _وحدات الماكرو_ التي تسمح لك بمعالجة التعليمة البرمجية الخاصة بك. إليك مثال بسيط عن بعض Clojure التي يمكنك دراستها: | |||
|  | 
 | |||
|  |  `   (defn hello-world [] (println "Hello world!"))  | |||
|  | `  | |||
|  | 
 | |||
|  | هذا يحدد وظيفة (باستخدام الماكرو `defn` ) تسمى `hello-world` لا يأخذ أي إدخال ( `[]` ) ويطبع `"Hello world!"` إلى وحدة التحكم. يمكننا أن نسميها كما يلي: | |||
|  | 
 | |||
|  |  `   (hello-world)  | |||
|  |    ; => Hello world!  | |||
|  |    ;    nil  | |||
|  | `  | |||
|  | 
 | |||
|  | ## Clojure هي لغة وظيفية.
 | |||
|  | 
 | |||
|  | جميع المتغيرات في Clojure غير قابلة للتغيير ، ولا يمكن تغييرها باستخدام عامل تعيين ( `=` في معظم لغات C-like) أو بواسطة وظيفة. تهدف جميع الوظائف إلى أن تكون _شفافة بشكل مرجعي_ ، مما يعني أنه إذا أعطيتهم نفس المدخلات ، فعليهم إعطاء نفس الناتج مهما كان. المثال `hello-world` المرحب أعلاه هو شفاف بشكل مرجعي - سيطبع دائمًا "مرحباً بالعالم!" لا يهم ماذا. شيء ما يعتمد على مولد رقم عشوائي غير شفاف بشكل مرجعي ، لأن ناتجها عشوائي. | |||
|  | 
 | |||
|  |  `  (defn random-function []  | |||
|  |     (if (> (rand 4) 2)     ; if a random number between 0 and 2 is greater than 2...  | |||
|  |       (println "foo")      ; ...print "foo". otherwise...  | |||
|  |       (println "bar")))    ; ...print "bar"  | |||
|  | `  | |||
|  | 
 | |||
|  | على الرغم من أن عدم القدرة على تغيير المتغيرات قد يبدو مروعًا ، إلا أنه أسهل بكثير مما تعتقد ، خاصة إذا كانت اللغة مبنية حوله (مثل Clojure is!) ، ويمكن أن يؤدي تجنب التحور غير الضروري إلى جعل الكود أقل كثيرًا. | |||
|  | 
 | |||
|  | ## Clojure يعمل على Java Virtual Machine.
 | |||
|  | 
 | |||
|  | JVM هو الجهاز الظاهري الذي يفسر جافا bytecode ويستخدمه لتشغيل البرنامج. هذا يعني أن Clojure يعمل بسلاسة تامة مع الكود المصمم لجافا (على الرغم من أنه يبدو غريبا بعض الشيء) ، وهذا يعني أيضا أنه يعمل بسرعة كبيرة مقارنة مع اللسب الأخرى. في حين أنه أبطأ قليلاً من Java ، فإنه لا يزال أسرع بكثير من Python أو Ruby أو Javascript. | |||
|  | 
 | |||
|  |  `  (.indexOf [1 2 3 4] 2) ;; .indexOf is a Java method!  | |||
|  |   ; => 1  | |||
|  | `  | |||
|  | 
 | |||
|  | ## تم تصميم Clojure للتوافق.
 | |||
|  | 
 | |||
|  | يعني "التزامن" هنا "برنامجًا واحدًا يعمل على عدة سلاسل محادثات في وقت واحد" ، مما قد يجعل التعليمة البرمجية أسرع. ويمكن أيضا أن يجعل كود buggier الخاص بك ؛ تخيل لو كان هناك وظيفتين مختلفتين يتغيران ويقرأان من نفس الكائن في نفس الوقت! سيكون من الفوضى المطلقة. لحسن الحظ ، في Clojure ، المتغيرات هي غير قابلة للتغيير ، مما يعني أنه لا توجد فرصة لهذا النوع من الفوضى كسر فضفاضة. تحتوي اللغة أيضًا على مجموعة متنوعة من الميزات لتسهيل كتابة التعليمات البرمجية المتزامنة ، مثل نظام ذاكرة معاملات البرامج ، والوكلاء والذرات. | |||
|  | 
 | |||
|  | |  السابق [ الصفحة الرئيسية ](//forum.freecodecamp.com/t/clojure-resources/18422) | [التالى ](//forum.freecodecamp.com/t/clojure-the-basics/18410) |   | |||
|  | | | [جدول المحتويات](//forum.freecodecamp.com/t/clojure-resources/18422) | [أساسيات](//forum.freecodecamp.com/t/clojure-the-basics/18410) | |