وظيفة من الدرجة الأولى
في علم الحاسوب ، يُقال إن لغة البرمجة تتمتع بوظائف من الدرجة الأولى إذا كانت تعامل الوظائف كعناصر أساسية . وهذا يعني أن اللغة تدعم تمرير الوظائف كوسائط لوظائف أخرى، وإعادتها كقيم من وظائف أخرى، وتعيينها لمتغيرات أو تخزينها في هياكل بيانات. [ 1 ] ويشترط بعض منظري لغات البرمجة دعم الوظائف المجهولة (القيم الحرفية للوظائف) أيضًا. [ 2 ] في اللغات التي تتمتع بوظائف من الدرجة الأولى، لا تتمتع أسماء الوظائف بأي وضع خاص؛ إذ تُعامل كمتغيرات عادية من نوع دالة . [ 3 ] وقد صاغ هذا المصطلح كريستوفر ستراشي في سياق "الوظائف كعناصر أساسية" في منتصف الستينيات. [ 4 ]
تُعدّ الدوال من الدرجة الأولى ضرورةً في أسلوب البرمجة الوظيفية ، حيث يُعتبر استخدام الدوال من الرتبة العليا ممارسةً شائعة. ومن الأمثلة البسيطة على الدوال من الرتبة العليا دالة map ، التي تأخذ كمعاملات دالة وقائمة، وتُعيد القائمة الناتجة عن تطبيق الدالة على كل عنصر من عناصر القائمة. ولكي تدعم لغة البرمجة دالة map ، يجب أن تدعم تمرير دالة كمعامل.
توجد بعض الصعوبات في تنفيذ تمرير الدوال كوسائط أو إعادتها كنتائج، خاصةً في وجود متغيرات غير محلية مُعرَّفة في الدوال المتداخلة والمجهولة . تاريخيًا، عُرفت هذه الصعوبات بمشاكل funarg ، نسبةً إلى وسيط الدالة . [ 5 ] في لغات البرمجة الإجرائية المبكرة، تم تجنب هذه المشاكل إما بعدم دعم الدوال كأنواع نتائج (مثل ALGOL 60 و Pascal ) أو بحذف الدوال المتداخلة وبالتالي المتغيرات غير المحلية (مثل C ). اتخذت لغة Lisp، وهي لغة وظيفية مبكرة، نهج النطاق الديناميكي ، حيث تشير المتغيرات غير المحلية إلى أقرب تعريف لهذا المتغير عند نقطة تنفيذ الدالة، بدلاً من نقطة تعريفه. تم تقديم دعم مناسب للدوال من الدرجة الأولى ذات النطاق المعجمي في لغة Scheme ، ويتطلب ذلك التعامل مع مراجع الدوال كدوال مغلقة بدلاً من مؤشرات الدوال المجردة ، [ 4 ] مما يجعل جمع البيانات المهملة ضرورة حتمية.
المفاهيم
في هذا القسم، نقارن كيفية التعامل مع أساليب البرمجة المحددة في لغة وظيفية ذات وظائف من الدرجة الأولى ( هاسكل ) مقارنة بلغة إجرائية حيث تكون الوظائف مواطنين من الدرجة الثانية ( سي ).
الدوال ذات الرتبة العليا: تمرير الدوال كوسائط
في اللغات التي تُعامل فيها الدوال كعناصر أساسية، يمكن تمرير الدوال كوسائط إلى دوال أخرى بنفس طريقة تمرير القيم الأخرى (تُسمى الدالة التي تأخذ دالة أخرى كوسيط دالة من الرتبة العليا). في لغة هاسكل :
map :: ( a -> b ) -> [ a ] -> [ b ] map f [] = [] map f ( x : xs ) = f x : map f xsاللغات التي لا تُعتبر فيها الدوال من الدرجة الأولى تسمح غالبًا بكتابة دوال من الرتبة العليا باستخدام ميزات مثل مؤشرات الدوال أو المفوضين . في لغة C :
void map ( int ( * f )( int ), int x [], size_t n ) { for ( int i = 0 ; i < n ; ++ i ) { x [ i ] = f ( x [ i ]); } }توجد عدة اختلافات بين الطريقتين لا تتعلق مباشرةً بدعم الدوال من الدرجة الأولى. يعمل مثال هاسكل على القوائم ، بينما يعمل مثال سي على المصفوفات . كلاهما من أكثر هياكل البيانات المركبة طبيعيةً في اللغتين، وكان من شأن جعل مثال سي يعمل على القوائم المتصلة أن يجعله معقدًا بلا داعٍ. وهذا يفسر أيضًا حاجة دالة سي إلى مُعامل إضافي (يحدد حجم المصفوفة). تُحدِّث دالة سي المصفوفة في مكانها ، دون إرجاع أي قيمة، بينما في هاسكل تكون هياكل البيانات مُستمرة (تُرجع قائمة جديدة بينما تبقى القديمة كما هي). يستخدم مثال هاسكل الاستدعاء الذاتي لاجتياز القائمة، بينما يستخدم مثال سي التكرار . مرة أخرى، هذه هي الطريقة الأكثر طبيعية للتعبير عن هذه الدالة في كلتا اللغتين، ولكن كان من الممكن بسهولة التعبير عن مثال هاسكل باستخدام الطي ، ومثال سي باستخدام الاستدعاء الذاتي. أخيرًا، دالة هاسكل لها نوع متعدد الأشكال ، ولأن هذا غير مدعوم في سي، فقد ثبّتنا جميع متغيرات النوع على ثابت النوع int.
الدوال المجهولة والمتداخلة
في اللغات التي تدعم الدوال المجهولة، يمكننا تمرير مثل هذه الدالة كوسيط إلى دالة من الرتبة العليا:
main = map ( \ x -> 3 * x + 1 ) [ 1 , 2 , 3 , 4 , 5 ]في لغة لا تدعم الدوال المجهولة، علينا ربطها باسم بدلاً من ذلك:
دالة f ( عدد صحيح x ) { إرجاع 3 * x + 1 ; }int main () { int list [] = { 1 , 2 , 3 , 4 , 5 }; map ( f , list , 5 ); }المتغيرات غير المحلية والإغلاقات
بمجرد أن نحصل على دوال مجهولة أو متداخلة، يصبح من الطبيعي أن تشير هذه الدوال إلى متغيرات خارج نطاقها (تسمى المتغيرات غير المحلية ):
main = let a = 3 b = 1 in map ( \ x -> a * x + b ) [ 1 , 2 , 3 , 4 , 5 ]إذا مُثِّلت الدوال بمؤشرات دوال مجردة، فلن نتمكن من معرفة كيفية تمرير القيمة الموجودة خارج جسم الدالة إليها، ولذلك يلزم إنشاء إغلاق يدوي. لذا، لا يمكننا الحديث هنا عن دوال "من الدرجة الأولى".
typedef struct { int ( * f )( int , int , int ); int a ; int b ; } Closure ;void map ( Closure * closure , int x [], size_t n ) { for ( int i = 0 ; i < n ; ++ i ) { x [ i ] = ( closure -> f )( closure -> a , closure -> b , x [ i ]); } }دالة f ( عدد صحيح a ، عدد صحيح b ، عدد صحيح x ) { تُرجع a * x + b ؛ }void main () { int l [] = { 1 , 2 , 3 , 4 , 5 }; int a = 3 ; int b = 1 ; Closure closure = { f , a , b }; map ( & closure , l , 5 ); }لاحظ أيضًا أن هذه mapالخاصية مُخصصة الآن للدوال التي تُشير إلى متغيرين intخارج بيئتهما. يُمكن إعدادها بشكل عام، ولكن يتطلب ذلك كتابة المزيد من التعليمات البرمجية النمطية . لو fكانت دالة مُتداخلة، لكانت المشكلة نفسها قائمة، وهذا هو سبب عدم دعمها في لغة C. [ 6 ]
الدوال ذات الرتبة العليا: إرجاع الدوال كنتائج
عند إرجاع دالة، فإننا في الواقع نعيد نطاقها المغلق. في مثال لغة C، ستخرج أي متغيرات محلية مُستَخدَمة في النطاق المغلق من نطاقها بمجرد العودة من الدالة التي أنشأت النطاق المغلق. سيؤدي فرض النطاق المغلق في وقت لاحق إلى سلوك غير مُعرَّف، وربما يُتلف مكدس الاستدعاءات. تُعرف هذه المشكلة بمشكلة الوسائط التصاعدية .
إسناد الدوال إلى المتغيرات
إن إسناد الدوال إلى المتغيرات وتخزينها داخل هياكل البيانات (العامة) قد يعاني من نفس الصعوبات التي تواجهها الدوال المُعادة.
f :: [[ Integer ] -> [ Integer ]] f = let a = 3 b = 1 in [ map ( \ x -> a * x + b ), map ( \ x -> b * x + a )]تساوي الدوال
بما أنه يمكن اختبار معظم القيم الحرفية والقيم للتأكد من تساويها، فمن الطبيعي التساؤل عما إذا كانت لغة البرمجة تدعم اختبار تساوي الدوال. عند التدقيق، يبدو هذا السؤال أكثر تعقيدًا، ويتعين التمييز بين عدة أنواع من تساوي الدوال: [ 7 ]
- المساواة الامتدادية
- تُعتبر الدالتان f و g متساويتين امتدادياً إذا اتفقتا على مخرجاتهما لجميع المدخلات (∀ x . f ( x ) = g ( x )). وفقًا لهذا التعريف للمساواة، على سبيل المثال، يُعتبر أي تطبيقين لخوارزمية فرز مستقرة ، مثل فرز الإدراج وفرز الدمج ، متساويين. يُعدّ تحديد المساواة الامتدادية غير قابل للتقرير بشكل عام، وحتى بالنسبة للدوال ذات المجالات المحدودة، غالبًا ما يكون غير قابل للحل. لهذا السبب، لا تُطبّق أي لغة برمجة مساواة الدوال كمساواة امتدادية.
- المساواة القصدية
- في إطار المساواة القصدية، تُعتبر الدالتان f و g متساويتين إذا كانت لهما نفس "البنية الداخلية". يمكن تطبيق هذا النوع من المساواة في اللغات المفسرة بمقارنة الشيفرة المصدرية لأجسام الدوال (كما في لغة Interpreted Lisp 1.5)، أو الشيفرة التنفيذية في اللغات المترجمة . تستلزم المساواة القصدية المساواة الامتدادية (بافتراض أن الدوال حتمية ولا تحتوي على مدخلات مخفية، مثل عداد البرنامج أو متغير عام قابل للتغيير ).
- مساواة مرجعية
- نظراً لصعوبة تطبيق المساواة الامتدادية والقصدية عملياً، تستخدم معظم اللغات التي تدعم اختبار تساوي الدوال المساواة المرجعية. تُخصص لكل دالة أو إغلاق معرف فريد (عادةً ما يكون عنوان جسم الدالة أو الإغلاق)، ويُحدد التساوي بناءً على تساوي هذا المعرف. يُعتبر تعريفان لدالتين متطابقتين تماماً، وإن تم تعريفهما بشكل منفصل، غير متساويين. تستلزم المساواة المرجعية المساواة القصدية والامتدادية. إلا أن المساواة المرجعية تُخلّ بالشفافية المرجعية ، ولذلك فهي غير مدعومة في اللغات النقية ، مثل هاسكل.
نظرية الأنواع
في نظرية الأنواع ، يُمكن كتابة نوع الدوال التي تقبل قيمًا من النوع A وتُرجع قيمًا من النوع B على النحو التالي: A → B أو B → A. في تناظر كاري-هوارد ، ترتبط أنواع الدوال بالاستلزام المنطقي ؛ ويرتبط تجريد لامدا بتفريغ الافتراضات الافتراضية، بينما يرتبط تطبيق الدالة بقاعدة الاستدلال modus ponens . بالإضافة إلى الحالة المعتادة لدوال البرمجة، تستخدم نظرية الأنواع أيضًا الدوال من الدرجة الأولى لنمذجة المصفوفات الترابطية وهياكل البيانات المشابهة .
في النظريات الفئوية للبرمجة، يتوافق توفر الدوال من الدرجة الأولى مع فرضية الفئة المغلقة . على سبيل المثال، يتوافق حساب لامدا ذو النوع البسيط مع اللغة الداخلية للفئات المغلقة الديكارتية .
الدعم اللغوي
تتميز لغات البرمجة الوظيفية، مثل إرلانج ، وسكيم ، وإم إل ، وهاسكل ، وإف شارب ، وسكالا ، بوجود دوال من الدرجة الأولى. عند تصميم لغة ليسب ، إحدى أقدم اللغات الوظيفية، لم تكن جميع جوانب دوال الدرجة الأولى مفهومة تمامًا آنذاك، مما أدى إلى تحديد نطاق الدوال ديناميكيًا. أما لهجات سكيم وكومون ليسب اللاحقة ، فتتميز بوجود دوال من الدرجة الأولى ذات نطاق معجمي.
تحتوي العديد من لغات البرمجة النصية، بما في ذلك Perl و Python و PHP و Lua و Tcl /Tk و JavaScript و Io ، على وظائف من الدرجة الأولى.
في لغات البرمجة الإجرائية، يجب التمييز بين لغة ألغول ومشتقاتها مثل باسكال، وعائلة لغات سي التقليدية، واللغات الحديثة التي تستخدم خاصية جمع البيانات المهملة. سمحت عائلة ألغول بالدوال المتداخلة والدوال ذات الرتبة العليا التي تأخذ وسائط، لكنها لم تسمح بالدوال ذات الرتبة العليا التي تُرجع دوالًا كنتائج (باستثناء ألغول 68 التي تسمح بذلك). والسبب في ذلك هو عدم معرفة كيفية التعامل مع المتغيرات غير المحلية في حال إرجاع دالة متداخلة كنتيجة (وتُنتج ألغول 68 أخطاءً أثناء التشغيل في مثل هذه الحالات).
سمحت عائلة لغات C بتمرير الدوال كوسائط وإعادتها كنتائج، لكنها تجنبت أي مشاكل بعدم دعمها للدوال المتداخلة. (يسمح مُصرّف gcc بها كامتداد). ولأن فائدة إعادة الدوال تكمن أساسًا في القدرة على إعادة الدوال المتداخلة التي تحتوي على متغيرات غير محلية، بدلًا من الدوال ذات المستوى الأعلى، فإن هذه اللغات لا تُعتبر عمومًا ذات دوال من الدرجة الأولى.
تدعم لغات البرمجة الإجرائية الحديثة غالبًا خاصية جمع البيانات المهملة، مما يجعل تنفيذ الدوال من الدرجة الأولى ممكنًا. وقد اقتصر دعم الدوال من الدرجة الأولى في كثير من الأحيان على الإصدارات اللاحقة من اللغة، بما في ذلك C# 2.0 وامتداد Blocks من Apple للغات C وC++ وObjective-C. أضافت C++11 دعمًا للدوال المجهولة والإغلاقات، ولكن نظرًا لعدم اعتماد اللغة على خاصية جمع البيانات المهملة، يجب توخي الحذر عند التعامل مع المتغيرات غير المحلية في الدوال التي تُعاد كنتائج (انظر أدناه).
| لغة | الدوال ذات الرتبة العليا | الدوال المتداخلة | المتغيرات غير المحلية | ملحوظات | ||||
|---|---|---|---|---|---|---|---|---|
| الحجج | نتائج | تم تسميته | مجهول | عمليات الإغلاق | تطبيق جزئي | |||
| عائلة الغول | ALGOL 60 | نعم | لا | نعم | لا | إلى الأسفل | لا | تتضمن أنواع الدوال . |
| ALGOL 68 | نعم | نعم [ 8 ] | نعم | نعم | إلى الأسفل [ 9 ] | لا | ||
| باسكال | نعم | لا | نعم | لا | إلى الأسفل | لا | ||
| آدا | نعم | لا | نعم | لا | إلى الأسفل | لا | ||
| أوبرون | نعم | غير متداخلة فقط | نعم | لا | إلى الأسفل | لا | ||
| دلفي | نعم | نعم | نعم | 2009 | 2009 | لا | ||
| عائلة C | ج | نعم | نعم | نعم في لغة GNU C | نعم في Clang ( الكتل ) | نعم في Clang ( الكتل ) | لا | يحتوي على مؤشرات وظائف . |
| لغة سي++ | نعم | نعم | C++11 [ 10 ] | C++11 [ 11 ] | C++11 [ 11 ] | C++11 | يحتوي على مؤشرات الدوال وكائنات الدوال . (انظر أيضًا أدناه.) تطبيق جزئي صريح ممكن باستخدام | |
| سي شارب | نعم | نعم | 7 | 2.0 / 3.0 | 2.0 | 3.0 | يحتوي على مندوبين (2.0) وتعبيرات لامدا (3.0). | |
| أوبجكتيف سي | نعم | نعم | استخدام مجهول الهوية | 2.0 + كتل [ 12 ] | 2.0 + Blocks | لا | يحتوي على مؤشرات وظائف. | |
| جافا | نعم | نعم | استخدام مجهول الهوية | جافا 8 | جافا 8 | نعم | يحتوي على فئات داخلية مجهولة . | |
| يذهب | نعم | نعم | استخدام مجهول الهوية | نعم | نعم | نعم [ 13 ] | ||
| ليمبو | نعم | نعم | نعم | نعم | نعم | لا | ||
| نيوزكوا | نعم | نعم | نعم | نعم | نعم | لا | ||
| الصدأ | نعم | نعم | نعم | نعم | نعم | نعم [ 14 ] | ||
| اللغات الوظيفية | التلعثم | بناء الجملة | بناء الجملة | نعم | نعم | لغة الشفرة الشائعة | لا | (انظر أدناه) |
| مخطط | نعم | نعم | نعم | نعم | نعم | SRFI 26 [ 15 ] | ||
| جوليا | نعم | نعم | نعم | نعم | نعم | نعم | ||
| كلوجر | نعم | نعم | نعم | نعم | نعم | نعم | ||
| ML | نعم | نعم | نعم | نعم | نعم | نعم | ||
| هاسكل | نعم | نعم | نعم | نعم | نعم | نعم | ||
| jq | نعم | لا | نعم | التعبيرات فقط | إلى الأسفل | لا | ||
| سكالا | نعم | نعم | نعم | نعم | نعم | نعم | ||
| إرلانغ | نعم | نعم | نعم | نعم | نعم | نعم | ||
| إكسير | نعم | نعم | نعم | نعم | نعم | نعم | ||
| فا# | نعم | نعم | نعم | نعم | نعم | نعم | ||
| أوكاميل | نعم | نعم | نعم | نعم | نعم | نعم | ||
| لغات البرمجة النصية | Io | نعم | نعم | نعم | نعم | نعم | لا | |
| جافا سكريبت | نعم | نعم | نعم | نعم | نعم | ECMAScript 5 | التطبيق الجزئي ممكن باستخدام كود المستخدم على ES3 [ 16 ] | |
| لغة لوا | نعم | نعم | نعم | نعم | نعم | نعم [ 17 ] | ||
| PHP | نعم | نعم | استخدام مجهول الهوية | 5.3 | 5.3 | لا | التطبيق الجزئي ممكن باستخدام كود المستخدم. | |
| بيرل | نعم | نعم | 6 | نعم | نعم | 6 [ 18 ] | ||
| بايثون | نعم | نعم | نعم | التعبيرات فقط | نعم | 2.5 [ 19 ] | (انظر أدناه) | |
| روبي | بناء الجملة | بناء الجملة | غير محدد النطاق | نعم | نعم | 1.9 | (انظر أدناه) | |
| لغات أخرى | فورتران | نعم | نعم | نعم | لا | لا | لا | |
| خشب القيقب | نعم | نعم | نعم | نعم | نعم | لا | ||
| ماثيماتيكا | نعم | نعم | نعم | نعم | نعم | لا | ||
| MATLAB | نعم | نعم | نعم | نعم [ 20 ] | نعم | نعم | يمكن تطبيق ذلك جزئياً عن طريق التوليد التلقائي لوظائف جديدة. [ 21 ] | |
| أحاديث قصيرة | نعم | نعم | نعم | نعم | نعم | جزئي | يمكن تطبيق جزء من الطلب من خلال المكتبة. | |
| سويفت | نعم | نعم | نعم | نعم | نعم | نعم | ||
- لغة سي++
- في لغة C++11، يمكن للدوال المغلقة التقاط المتغيرات غير المحلية عن طريق النسخ، أو عن طريق المرجع (دون تمديد عمرها)، أو عن طريق النقل (حيث يبقى المتغير موجودًا طالما بقيت الدالة المغلقة). الخيار الأول آمن إذا تم إرجاع الدالة المغلقة، ولكنه يتطلب نسخًا ولا يمكن استخدامه لتعديل المتغير الأصلي (الذي قد لا يكون موجودًا وقت استدعاء الدالة المغلقة). أما الخيار الثاني، فيُحتمل أن يتجنب النسخ المكلف ويسمح بتعديل المتغير الأصلي، ولكنه غير آمن في حال تم إرجاع الدالة المغلقة (انظر المراجع المعلقة ). بينما الخيار الثالث آمن إذا تم إرجاع الدالة المغلقة ولا يتطلب نسخًا، ولكنه لا يمكن استخدامه لتعديل المتغير الأصلي أيضًا.
- جافا
- لا تستطيع دوال الإغلاق في Java 8 التقاط سوى المتغيرات غير المحلية النهائية أو "شبه النهائية". تُمثَّل أنواع الدوال في Java كفئات. تأخذ الدوال المجهولة النوع المُستنتج من السياق. مراجع الأساليب محدودة. لمزيد من التفاصيل، راجع قسم "الدوال المجهولة" في " قيود Java" .
- التلعثم
- تدعم متغيرات لغة ليسب ذات النطاق المعجمي الدوال المغلقة. أما المتغيرات ذات النطاق الديناميكي فلا تدعم الدوال المغلقة أو تحتاج إلى بنية خاصة لإنشائها. [ 22 ]
- في لغة Common Lisp ، لا يمكن استخدام مُعرِّف دالة في نطاق أسماء الدوال كمرجع لقيمة من الدرجة الأولى.
functionيجب استخدام المعامل الخاص لاسترجاع الدالة كقيمة:(function foo)يُقيَّم إلى كائن دالة.#'fooيوجد كاختصار. لتطبيق كائن دالة كهذا، يجب استخدامfuncallالدالة:(funcall #'foo bar baz). - بايثون
- تطبيق جزئي صريح
functools.partialمنذ الإصدار 2.5،operator.methodcallerومنذ الإصدار 2.6. - روبي
- لا يمكن استخدام مُعرِّف "الدالة" العادية في لغة روبي (وهي في الواقع طريقة) كقيمة أو تمريرها. يجب أولاً استرجاعه إلى كائن
MethodأوProcكائن لاستخدامه كبيانات من الدرجة الأولى. يختلف بناء جملة استدعاء كائن الدالة هذا عن استدعاء الطرق العادية. - لا تقوم تعريفات الأساليب المتداخلة فعلياً بتداخل النطاق.
- التزيين الصريح باستخدام
.
انظر أيضاً
- إلغاء الوظيفة
- تقييم
- رسالة من الدرجة الأولى
- حساب كابا – شكلية تستبعد الدوال من الدرجة الأولى
- اختبار الرجل أو الصبي
- تطبيق جزئي
ملحوظات
- ↑ أبيلسون، هارولد ؛ سوسمان، جيرالد جاي (1984). بنية وتفسير برامج الحاسوب . مطبعة معهد ماساتشوستس للتكنولوجيا. صياغة التجريدات باستخدام الإجراءات ذات الرتبة العليا . ISBN 0-262-01077-1أُرشف من المصدر الأصلي بتاريخ 21 سبتمبر 2021. تم الاطلاع عليه بتاريخ 27 سبتمبر 2021 .
- ↑ براغماتية لغة البرمجة ، بقلم مايكل لي سكوت، القسم 11.2 "البرمجة الوظيفية".
- ^ روبرتو إيروساليمشي . لويز هنريكي دي فيغيريدو؛ فالديمار سيليس (2005). "تنفيذ لوا 5.0" . مجلة علوم الكمبيوتر العالمية . 11 (7): 1159-1176 . دوى : 10.3217 / jucs-011-07-1159 .
- 1 2 بورستال، رود؛ ستراشي، كريستوفر (2000). "فهم لغات البرمجة" (ملف PDF) . الحوسبة الرمزية والحسابية من الرتبة العليا . 13 (52): 11-49 . doi : 10.1023/A:1010052305354 . S2CID 1989590. مؤرشف من الأصل في 16 فبراير 2010.
{{cite journal}}: CS1 maint: bot: حالة عنوان URL الأصلي غير معروفة ( رابط ) (أيضًا في 2010-02-16 - ↑ جويل موسى . "وظيفة الدالة في لغة ليسب، أو لماذا يجب تسمية مشكلة FUNARG بمشكلة البيئة" . مذكرة معهد ماساتشوستس للتكنولوجيا للذكاء الاصطناعي 199، 1970.
- ↑ "إذا حاولت استدعاء الدالة المتداخلة من خلال عنوانها بعد انتهاء الدالة الحاوية، فستحدث كارثة." ( مجموعة مترجمات جنو: الدوال المتداخلة )
- ↑ أندرو دبليو. أبيل (1995). "المساواة المقصودة ;=) للاستمراريات" .
- ↑ تانينباوم، أ.س. (1977). "مقارنة بين باسكال وألغول 68" . مجلة الكمبيوتر . 21 (4): 319. doi : 10.1093/comjnl/21.4.316 .
- ↑ "تاريخ بايثون: أصول ميزات بايثون "الوظيفية"" . 21 أبريل 2009.
- ↑ الدوال المتداخلة باستخدام تعبيرات لامدا/الإغلاقات
- 1 2 الوثيقة رقم 1968 : ف. سامكو؛ ج. ويلكوك، ج. يارفي، د. غريغور، أ. لومسدين (26 فبراير 2006) تعابير لامدا والإغلاقات للغة C++
- ↑ "مركز مطوري ماك: مواضيع برمجة الكتل: مقدمة" . مؤرشف من الأصل بتاريخ 31-08-2009.
- ↑ "مثالان في لغة Go يمكنك من خلالهما تطبيق جزئي" .
- ↑ "partial_application" . Docs.rs. تم الاطلاع عليه بتاريخ 2020-11-03 .
- ↑ "SRFI 26: تدوين لتخصيص المعلمات بدون استخدام تقنية Currying" .
- ↑ "جون ريسيج - تطبيق جزئي في جافا سكريبت" .
- ↑ كاتز، إيان (23 يوليو 2010). "كود لوا لـ Curry (وظائف Currying)" . مؤرشف من الأصل في 6 نوفمبر 2018.
- ↑ "مدونة | Perlgeek.de :: Currying" .
- ↑ "ما الجديد في بايثون 2.5 — وثائق بايثون 3.10.0" .
- ↑ "الوظائف المجهولة - MATLAB و Simulink - MathWorks المملكة المتحدة" .
- ↑ تقييم الدوال الجزئية في MATLAB
- ↑ الإغلاقات في لغة زيتا ليسب، مؤرشفة بتاريخ 19 مارس 2012 في أرشيف الإنترنت
مراجع
- ليونيداس فيغاراس . "اللغات الوظيفية والدوال ذات الرتبة العليا" . CSE5317/CSE4305: تصميم وبناء المترجمات. جامعة تكساس في أرلينغتون.
روابط خارجية
- وظائف من الدرجة الأولى في برنامج Rosetta Code .
- الدوال ذات الرتبة العليا. مؤرشفة بتاريخ ١٢ نوفمبر ٢٠١٩ في أرشيف الإنترنت (Wayback Machine) على موقع IBM developerWorks.
- بناء المترجم
- أنواع البيانات
- البرمجة الوظيفية
- الأنواع الأولية
- نظرية لغات البرمجة
- البرامج الفرعية
