79 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| title: Clojure More on Functions
 | |
| localeTitle: Clojure More on Functions
 | |
| ---
 | |
| المهام! انهم مهم جدا. من الصعب جدًا القيام بأي شيء بدون وظيفة. فهي جزء لا يتجزأ من أي لغة ، ولكن بشكل خاص Clojure ، لأنها لغة برمجة وظيفية ترفض التصميم الموجه للكائنات. دعونا نتعلم المزيد عنها!
 | |
| 
 | |
| ## Arity
 | |
| 
 | |
| يشير **Arty** إلى عدد الوسيطات التي **تتوقعها** الدالة الخاصة بك.
 | |
| 
 | |
|  `;; add expects 2 arguments. Its arity is 2. 
 | |
|  (defn add [xy] (+ xy)) 
 | |
|  (add 2 2) 
 | |
|  ; => 4 
 | |
|  
 | |
|  ;; + itself is a function, and it can have any number of arguments. 
 | |
|  (+ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16) ;; and so on... 
 | |
|  ; => 136 
 | |
| ` 
 | |
| 
 | |
| تحتوي لغة Clojure على بعض الصيغ الخاصة التي تسمح لك بترك وظيفتك تختلف باختلاف عدد الحجج التي تتلقاها. وهذا ما يسمى arity متغير.
 | |
| 
 | |
|  `(defn foo 
 | |
|   ([]                               ; if this function gets no arguments... 
 | |
|     (println "Lisa needs braces!")) ; do this. 
 | |
|   ([arg1]                           ; if this function gets 1 argument... 
 | |
|     (println "Dental plan!")))      ; do this instead! 
 | |
|  (foo) 
 | |
|  ; => Lisa needs braces! 
 | |
|  ;    nil 
 | |
|  (foo "this is a placeholder argument.") 
 | |
|  ; => Dental plan! 
 | |
|  ;    nil 
 | |
| ` 
 | |
| 
 | |
|  [IDEOne ذلك!](https://ideone.com/sXGplb)
 | |
| 
 | |
| ## وظائف مجهولة
 | |
| 
 | |
| دعونا ننظر إلى وظيفة بسيطة حقا: وظيفة تضيف 1 إلى رقم.
 | |
| 
 | |
|  `;; I've called this function "my-inc" so you don't confuse it with inc. 
 | |
|  ;; inc is a built-in function that already does this for us. 
 | |
|  (defn my-inc [n] (+ 1 n)) 
 | |
|  (inc' 5) 
 | |
|  ; => 6 
 | |
| ` 
 | |
| 
 | |
| هذا يبدو بسيطا جدا. يأخذ معلمة واحدة - `n` - ويعيد `n + 1` . دعونا نختارها.
 | |
| 
 | |
|  `(def my-inc-2 (fn [n] (+ 1 n))) 
 | |
|  (inc' 5) 
 | |
|  ; => 6 
 | |
| ` 
 | |
| 
 | |
| يمكنك أن ترى من هذا أن استخدام `defn` هو مجرد اختزال لاستخدام `(def ... (fn ...))` . لكن هذا يكشف عن شيء مثير للاهتمام. ما نقوم به في الواقع ليس "تحديد وظيفة" ، إنه مجرد ربط وظيفة مجهولة باسم خاص - `inc'` . ماذا لو لم نعطيه اسما؟
 | |
| 
 | |
|  `((fn [n] (+ 1 n)) 5) 
 | |
|  ; => 6 
 | |
| ` 
 | |
| 
 | |
| بام! فقاعة! Kapow! وظائف مجهولة. قد يبدو هذا غير ذي جدوى الآن ، ولكنه يأتي في وقت لاحق مفيد جدًا لتطبيق الوظائف على القوائم باستخدام `map` `reduce` `filter` . إعطاء كل وظيفة تكتب اسمها يصبح مملاً ومرهق وسريع.
 | |
| 
 | |
| هناك طريقة أقصر لكتابة الوظائف المجهولة ، والمخصصة لوظائف قصيرة للغاية وبسيطة. لا يسمح للتدمير أو متغير المتعري. ومع ذلك ، فمن موجزة للغاية.
 | |
| 
 | |
|  `(#(+ 1 %) 5) 
 | |
|  ; => 6 
 | |
| ` 
 | |
| 
 | |
| `#(...)` هي طريقة اختصار لتعريف وظيفة مجهولة. تشير `%` إلى الوسيطة الأولى إلى الدالة. إذا كانت وظيفتك تتوقع العديد من الوسيطات ، فيمكنك استخدام `%1, %2, ... %n` .
 | |
| 
 | |
|  `(#(str %1 %2 %3) "foo" "bar" "baz") 
 | |
|  ; => "foobarbaz" 
 | |
| ` 
 | |
| 
 | |
|  [IDEOne ذلك!](https://ideone.com/roYRgS)
 | |
| 
 | |
| | [ السابق](//forum.freecodecamp.com/t/clojure-loop-recur/18418) [ الصفحة الرئيسية ](//forum.freecodecamp.com/t/clojure-resources/18422) | [التالى ](//forum.freecodecamp.com/t/clojure-collections/18411) |  
 | |
| | [حلقة وتكرار](//forum.freecodecamp.com/t/clojure-loop-recur/18418) | [جدول المحتويات](//forum.freecodecamp.com/t/clojure-resources/18422) | [مجموعات](/http://forum.freecodecamp.com/t/clojure-collections/18411) | |