Ù ÙÙÙÙ Currying Ù٠تÙÙÙØ© Ù ØªÙØ¯Ù Ø© ÙÙØ¹Ù ٠٠ع Ø§ÙØ¯ÙاÙÙ. ÙØ³ØªØ®Ø¯Ù ÙÙ Ø§ÙØ¹Ø¯Ùد ٠٠اÙÙØºØ§Øª Ø§ÙØ¨Ø±Ù Ø¬ÙØ© Ø§ÙØ¢Ø®Ø±Ù ٠٠بÙÙÙÙ Ø¬Ø§ÙØ§ Ø³ÙØ±Ùبت.
Currying عبارة ع٠طرÙÙØ© ÙØªØÙÙÙ Ø§ÙØ¯ÙاÙÙ Ø§ÙØªÙ تÙÙÙ
Ø§ÙØ¯Ø§ÙÙØ© ذات Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡-Ø£ÙØ«Ø± Ù
Ù ÙØ³ÙØ·- f (aØ bØ c)â ÙØªØµØ¨Ø ÙØ§Ø¨ÙØ© ÙÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡ -Ø¨ÙØ³ÙØ· ÙØ§ØØ¯- ÙÙØ°Ø§ f(a)(b)(c)â.
تØÙ٠تÙÙÙØ© Currying Ø§ÙØ¯Ø§ÙÙØ© ÙÙØ· ÙÙØ§ ØªØ³ØªØ¯Ø¹ÙØ§.
ÙÙØ±Ù ÙÙ Ø§ÙØ¨Ø¯Ø§ÙØ© ٠ثاÙÙØ§Ø ÙÙÙ٠٠ا ÙØªØØ¯Ø« عÙÙ ÙÙÙ ÙØ§ Ø£ÙØ¶ÙØ ÙØ¨Ø¹Ø¯Ùا ÙÙØªÙÙ ÙÙØªØ·Ø¨ÙÙØ§Øª Ø§ÙØ¹Ù ÙÙØ©.
سÙÙØ´Ø¦ Ø¯Ø§ÙØ© Ù
ساعدة curry (f)â ÙØ§ÙÙØªÙ ستÙÙÙØ°Ù تÙÙÙØ© Currying عÙÙ Ø§ÙØ¯Ø§ÙÙØ© f Ø§ÙØªÙ ØªÙØ¨Ù ÙØ³ÙØ·ÙÙ. Ø¨ØªØ¹Ø¨ÙØ± Ø¢Ø®Ø±Ø ØªØÙÙ Ø§ÙØ¯Ø§ÙØ© curry(f)â Ø§ÙداÙÙØ© f(a, b)â Ø°Ø§Øª اÙÙØ³ÙØ·Ù٠إÙÙ Ø¯Ø§ÙØ© تعÙ
Ù ÙÙØ³ÙØ· ÙØ§ØØ¯f(a)(b)â:
function curry(f) { // â«Ø§ÙØ¯Ø§ÙØ©curry(f)â ÙÙ Ù
٠ستÙÙÙØ°Ù تØÙÙÙ currying
return function(a) {
return function(b) {
return f(a, b);
};
};
}
// طرÙÙØ© Ø§ÙØ§Ø³ØªØ®Ø¯Ø§Ù
function sum(a, b) {
return a + b;
}
let curriedSum = curry(sum);
alert( curriedSum(1)(2) ); // 3
Ù٠ا ÙØ±ÙØ ÙØ¥Ù Ø§ÙØªÙÙÙØ° Ø¨Ø³ÙØ·: Ø¥Ù٠٠جرد ٠غÙÙÙÙ ÙÙÙØ³Ø·Ø§Ø¡.
- ÙØªÙجة
curry(func)âÙÙ Ø¯Ø§ÙØ© ٠غÙÙÙØ©function(a)â. - Ø¹ÙØ¯Ù
ا تسÙ
Ù ÙÙØ°Ø§
curriedSum(1)âØ ØªÙØÙØ¸ اÙÙØ³Ø·Ø§Ø¡ ÙÙ Ø§ÙØ¨Ùئة اÙÙØºÙÙØ© ÙØ¬Ø§Ùا Ø³ÙØ±Ùبت (ÙÙÙ ÙÙØ¹ Ù ÙØ§ØµÙات اÙÙØºØ© ØªØ³ØªØ®Ø¯Ù ÙØªØ¹Ø±Ù٠ارتباط اÙ٠عرÙÙØ§Øª باÙ٠تغÙÙØ±Ø§Øª ÙØ§ÙØ¯ÙØ§Ù٠اÙÙ ØØ¯Ø¯Ø© ÙØ°ÙÙ Ø¨ÙØ§Ø¡Ù عÙ٠بÙÙØ© Ø§ÙØªØ±Ø§Ø¨Ø· اÙÙØºÙÙØ© ÙÙ Ø´ÙÙØ±Ø© ECMAScript)Ø ÙØªØ¹Ùد ØºÙØ§Ù Ø¬Ø¯ÙØ¯function(b)â. - Ø«Ù
Ù ÙÙØ³Ù
Ù ÙØ°Ø§ اÙÙ
غÙÙ٠باسÙ
2ÙØ³Ø¨Ø©Ù ÙÙØ³Ø·Ø§Ø¦ÙØ ÙÙÙÙ Ø±ÙØ± Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡ Ø¥ÙÙ Ø§ÙØ¯Ø§ÙÙØ©sum(a,b)âØ§ÙØ£ØµÙÙÙØ©.
Ù Ù Ø§ÙØ£Ù Ø«ÙØ© اÙÙ ØªÙØ¯Ù Ø© باستخدا٠تÙÙÙØ© currying ÙÙ _curry Ù Ù Ù ÙØªØ¨Ø© LodashØ ÙØ§ÙØªÙ ØªÙØ¹Ùد غÙÙØ§ÙÙØ§ اÙÙØ°Ù ÙØ³Ù Ø Ø¨Ø§Ø³ØªØ¯Ø¹Ø§Ø¡ Ø§ÙØ¯Ø§ÙÙØ© Ø·Ø¨ÙØ¹ÙÙØ§ ÙØ¬Ø²Ø¦ÙÙØ§:
function sum(a, b) {
return a + b;
}
let curriedSum = _.curry(sum); // â«Ø§Ø³ØªØ®Ø¯Ø§Ù
â_.curry Ù
Ù Ù
ÙØªØ¨Ø© lodash
alert( curriedSum(1, 2) ); // â«Ø§ÙÙØªÙجة: 3Ø ÙØ§Ùزا٠بإÙ
ÙØ§ÙÙØ§ Ø§Ø³ØªØ¯Ø¹Ø§Ø¤Ù Ø·Ø¨ÙØ¹ÙÙØ§
alert( curriedSum(1)(2) ); // â«Ø§ÙÙØªÙجة: 3Ø Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡ Ø§ÙØ¬Ø²Ø¦Ù
Ù٠اذا ÙØØªØ§Ø¬ ÙØªÙÙÙØ© curryingØ
ÙØ§Ø¨Ø¯ ÙÙØ§ ٠٠٠ثاÙÙ ÙØ§Ùع٠ÙÙÙÙ ÙÙØ§Ø¦Ø¯ ÙØ°Ù Ø§ÙØªÙÙÙØ©.
Ù
Ø«ÙÙØ§Ø ÙÙÙÙ ÙØ¯ÙÙØ§ داÙÙØ© Ø§ÙØªØ³Ø¬ÙÙ log(date, importance, message)â ÙØ§ÙÙØªÙ ستÙÙØ³Ù٠اÙÙ
عÙÙÙ
ات ÙØªØ¹Ø±Ø¶Ùا. Ù
Ø«Ù ÙØ°Ù Ø§ÙØ¯ÙاÙÙ Ù
ÙÙØ¯Ø© Ø¬Ø¯ÙØ§ Ù٠اÙÙ
Ø´Ø§Ø±ÙØ¹ Ø§ÙØÙÙÙØ© Ù
Ø«Ù: Ø¥Ø±Ø³Ø§Ù Ø§ÙØ³Ø¬Ùات عبر Ø§ÙØ´Ø¨ÙØ©Ø ÙÙ Ù
ثاÙÙØ§ Ø³ÙØ³ØªØ®Ø¯Ù
ÙÙØ· alert:
function log(date, importance, message) {
alert(`[${date.getHours()}:${date.getMinutes()}] [${importance}] ${message}`);
}
ÙÙÙÙÙØ°Ù تÙÙÙØ© currying عÙÙÙØ§!
log = _.curry(log);
بعد ذÙ٠ستعÙ
٠داÙÙØ© log ÙÙ٠اÙÙ
Ø·ÙÙØ¨:
log(new Date(), "DEBUG", "some debug"); // log(a, b, c)
⦠ÙÙÙÙÙØ§ ØªØ¹Ù Ù Ø£ÙØ¶Ùا بعد تØÙÙÙÙØ§ بتÙÙÙØ© currying:
log(new Date())("DEBUG")("some debug"); // log(a)(b)(c)
Ø§ÙØ¢Ù ÙÙ ÙÙÙØ§ بسÙÙÙØ© Ø¥ÙØ´Ø§Ø¡ داÙÙØ© Ù ÙØ§Ø³Ø¨Ø© ÙÙØ³Ø¬Ùات Ø§ÙØØ§ÙÙØ©:
// â«logNow سÙÙÙÙ Ø¯Ø§ÙØ© Ø¬Ø²Ø¦ÙØ© Ù
Ù log Ù
ع ÙØ³ÙØ· Ø£Ù٠ثابت
let logNow = log(new Date());
// استخداÙ
Ù
logNow("INFO", "message"); // [HH:mm] INFO message
Ø§ÙØ¢Ù logNow ÙÙ ÙÙØ³ Ø§ÙØ¯Ø§ÙØ© log Ø¨ÙØ³ÙØ· Ø£ÙÙ Ø«Ø§Ø¨ØªØ Ø¨Ù
عÙ٠آخر âØ¯Ø§ÙÙØ© Ù
Ø·Ø¨ÙØ© جزئÙÙØ§â Ø£Ù âØ¬Ø²Ø¦ÙØ©â ÙÙØ§Ø®ØªØµØ§Ø±.
ÙÙ ÙÙÙØ§ اÙÙ Ø¶Ù ÙØ¯Ù ÙØ§ ÙØ¥Ùشاء داÙÙØ© Ù ÙØ§Ø³Ø¨Ø© ÙØ³Ø¬Ùات تصØÙØ Ø§ÙØ£Ø®Ø·Ø§Ø¡ Ø§ÙØØ§ÙÙØ©:
let debugNow = logNow("DEBUG");
debugNow("message"); // [HH:mm] DEBUG message
إذا:
- ÙÙ
ÙÙÙØ¯ Ø£Ù Ø´ÙØ¡ بعد Ø§ÙØªØÙÙ٠بتÙÙÙØ© currying: ÙÙØ§ ÙØ²Ø§Ù ÙÙ
ÙÙÙØ§ Ø£ÙØ¶Ùا استدعاء Ø§ÙØ¯Ø§ÙÙØ©
logØ·Ø¨ÙØ¹ÙÙØ§. - ÙÙ ÙÙÙØ§ بسÙÙÙØ© Ø¥ÙØ´Ø§Ø¡ Ø¯ÙØ§ÙÙ Ø¬Ø²Ø¦ÙØ© Ù Ø«Ù: Ø³Ø¬ÙØ§Øª اÙÙÙÙ .
Ø§ÙØ§Ø³ØªØ®Ø¯Ø§Ù اÙÙ ØªÙØ¯Ù ÙØªÙÙÙØ© currying
ÙÙ ØØ§ÙØ© رغبت٠ÙÙ Ø§ÙØ¯Ø®ÙÙ ÙÙ Ø§ÙØªÙاصÙÙØ Ø¥ÙÙ٠طرÙÙØ© Ø§ÙØ§Ø³ØªØ®Ø¯Ø§Ù اÙÙ ØªÙØ¯Ù Ø© ÙØªÙÙÙØ© currying ÙÙØ¯ÙاÙ٠ذات اÙÙØ³Ø·Ø§Ø¡ اÙ٠تعددة ÙØ§ÙÙØªÙ ÙÙ ÙÙÙØ§ Ø§Ø³ØªØ®Ø¯Ø§Ù ÙØ§ Ø£Ø¹ÙØ§Ù.
ÙÙ٠٠ختصرة Ø¬Ø¯ÙØ§:
function curry(func) {
return function curried(...args) {
if (args.length >= func.length) {
return func.apply(this, args);
} else {
return function(...args2) {
return curried.apply(this, args.concat(args2));
}
}
};
}
Ø¥ÙÙ٠٠ثاÙÙØ§ ÙØ·Ø±ÙÙØ© استخدا٠Ù:
function sum(a, b, c) {
return a + b + c;
}
let curriedSum = curry(sum);
alert( curriedSum(1, 2, 3) ); // 6, still callable normally
alert( curriedSum(1)(2,3) ); // 6, currying of 1st arg
alert( curriedSum(1)(2)(3) ); // 6, full currying
تبد٠تÙÙÙØ© currying ÙÙÙÙÙØ© Ø§ÙØ£ÙÙÙ Ù Ø¹ÙØ¯Ø©ÙØ ÙÙÙÙÙØ§ ÙÙ Ø§ÙØÙÙÙØ© سÙÙØ© اÙÙÙÙ Ø¬Ø¯ÙØ§.
ÙØªÙجة استدعاء curry(func)â Ù٠داÙÙØ© Ù
ÙØºÙÙÙØ© curried ÙØ§ÙÙØªÙ تبد٠ÙÙØ°Ø§:
// func is the function to transform
function curried(...args) {
if (args.length >= func.length) { // (1)
return func.apply(this, args);
} else {
return function(...args2) { // (2)
return curried.apply(this, args.concat(args2));
}
}
};
Ø¹ÙØ¯ تشغÙÙÙØ ÙÙØ§Ù ÙØ±Ø¹ÙÙ ÙÙØªÙÙÙØ° Ù
Ù Ø§ÙØ¬Ù
ÙØ© Ø§ÙØ´Ø±Ø·ÙØ© if:
- If passed
argscount is the same or more than the original function has in its definition (func.length) , then just pass the call to it usingfunc.apply. - Otherwise, get a partial: we donât call
funcjust yet. Instead, another wrapper is returned, that will re-applycurriedproviding previous arguments together with the new ones.
Then, if we call it, again, weâll get either a new partial (if not enough arguments) or, finally, the result.
ÙØ¬Ø¨ Ø£Ù ÙÙÙÙ ÙÙØ¯Ø§ÙÙØ© عدد ثابت ٠٠اÙÙØ³Ø·Ø§Ø¡ ÙØªØ·Ø¨Ù٠تÙÙÙØ© currying.
إ٠استخدÙ
ت داÙÙØ©Ù Ù
ا Ù
عاÙ
ÙØ§Øª Ø§ÙØ¨ÙÙØ©Ø Ù
Ø«Ù: f(...args)âØ ÙÙØ§ ÙÙ
ÙÙ Ù
Ø¹Ø§ÙØ¬ØªÙا Ø¨ÙØ°Ù Ø§ÙØªÙÙÙØ©.
Ù ÙØ§ØØ¸Ø©: Ø£ÙØ«Ø± بÙÙÙ٠٠٠٠جرد تÙÙÙØ© تØÙÙÙ
Ø§ÙØ·ÙاÙÙØ§ Ù
Ù Ø§ÙØªØ¹Ø±ÙÙØ ÙØ¬Ø¨ عÙ٠تÙÙÙØ© currying تØÙÙÙ Ø§ÙØ¯Ø§ÙÙØ© sum(a, b, c)â Ø¥ÙÙ sum(a)(b)(c)â.
ÙÙÙ ØºØ§ÙØ¨ÙØ© تطبÙÙØ§Øª ÙØ°Ù Ø§ÙØªÙÙÙØ© ÙÙ Ø¬Ø§ÙØ§ Ø³ÙØ±Ùبت Ù ØªÙØ¯Ù Ø©Ø ÙÙ٠ا ÙØ¶ØÙا سابÙÙØ§: ÙÙÙ ØªØØ§Ùظ عÙÙ Ø§ÙØ¯Ø§ÙÙØ© ÙØ§Ø¨ÙØ© ÙÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡ بعدة تÙÙÙØ¹Ø§Øª ÙÙÙØ³Ø·Ø§Ø¡ اÙÙ ÙÙ Ø±ÙØ±Ø©.
Ø®ÙØ§ØµØ©
تÙÙÙØ© Currying Ù٠عÙ
ÙÙØ© تØÙÙ٠تجع٠f(a,b,c) ÙØ§Ø¨ÙØ© ÙÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡ ÙÙ f(a)(b)(c)â. عادة٠Ù
ا ØªØØ§Ùظ تطبÙÙØ§Øª Ø¬Ø§ÙØ§ Ø³ÙØ±Ùبت عÙÙ Ø§ÙØ¯ÙاÙ٠بØÙØ« تÙÙÙ ÙØ§Ø¨ÙØ© ÙÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡ Ø¨Ø§ÙØ´ÙÙ Ø§ÙØ·Ø¨ÙØ¹Ù Ø£Ù Ø§ÙØ¬Ø²Ø¦Ù Ø¥Ù ÙØ§Ù عدد اÙÙØ³Ø·Ø§Ø¡ ØºÙØ± ÙØ§ÙÙ.
ÙÙ
ا تسÙ
Ø ÙÙØ§ ÙØ°Ù Ø§ÙØªÙÙÙØ© Ø£ÙØ¶Ùا Ø¨Ø§ÙØØµÙ٠عÙÙ Ø¯ÙØ§ÙÙ Ø¬Ø²Ø¦ÙØ© بسÙÙÙØ©. ÙÙ
ا رأÙÙØ§ ÙÙ Ù
Ø«Ø§Ù Ø§ÙØªØ³Ø¬ÙÙØ بعد تÙÙÙØ° ÙØ°Ù Ø§ÙØªÙÙÙØ© عÙÙ Ø§ÙØ¯Ø§ÙÙØ© Ø§ÙØ¹Ø§ÙÙ
ÙØ© ذات Ø§ÙØ«Ùاث ÙØ³Ø·Ø§Ø¡ log(date, importance, message)â ÙØ¥Ù ذÙ٠سÙÙ
ÙØÙØ§ Ø¯ÙØ§ÙÙ Ø¬Ø²Ø¦ÙØ© Ø¹ÙØ¯ Ø§Ø³ØªØ¯Ø¹Ø§Ø¤ÙØ§ باستخداÙ
ÙØ³ÙØ· ÙØ§ØØ¯ (ÙÙØ°Ø§ log(date)â) Ø£Ù ÙØ³ÙØ·ÙÙ (ÙÙØ°Ø§ log(date, importance)â).
ترج٠ة -ÙØ¨ØªØµØ±Ù- ÙÙÙØµÙ Currying Ù Ù ÙØªØ§Ø¨ The JavaScript language

Ø§ÙØªØ¹ÙÙÙØ§Øª
<code>Ø ÙÙÙÙØ«Ùر Ù Ù Ø§ÙØ³Ø·Ùر استخدÙ<pre>Ø ÙÙØ£Ùثر Ù Ù 10 Ø³Ø·ÙØ± استخد٠(plnkr, JSBin, codepenâ¦)