دالة من الدرجة الأولى

في علوم الحاسوب، تُعتبر لغة البرمجة دالة من الدرجة الأولى إذا تعاملت مع الدوال كمواطنين من الدرجة الأولى، أي إذا كانت اللغة البرمجية تدعم تمرير الدوال كوسائط إلى دوال أخرى، وإعادتها كقيم من دوال أخرى، وتعيينها لمتغيرات أو تخزينها في بنية بيانات. ويشترط بعض منظّري لغات البرمجة أيضًا لكي تكون لغة البرمجة دوالًا من الدرجة الأولى أن تدعم كذلك تمرير وتعيين وتخزين الدوال المجهولة.Programming language pragmatics, by Michael Lee Scott, section 11.2 "Functional Programming". في اللغات التي تحتوي على دوال من الدرجة الأولى، لا تتمتع أسماء الدوال بأي وضع خاص؛ إذ تُعامل كمتغيرات عادية ذات نوع دالة. كان عالم الحاسوب البريطاني كريستوفر ستراتشي هو أول من صاغ هذا مصطلح دوال الدرجة الأولى في لغات البرمجة في منتصف الستينيات من القرن العشرين. (also on 2010-02-16

تُعد الدوال من الدرجة الأولى ضرورية لأسلوب البرمجة الوظيفية، حيث يُعد استخدام الدوال من الدرجة العليا ممارسةً شائعة. ومن الأمثلة البسيطة على الدوال من الدرجة العليا دالة الخريطة، والتي تتخذ دالة وقائمة كوسائط لها، وتُرجع القائمة المُكوّنة بتطبيق الدالة على كل عنصر من عناصر القائمة. ولكي تدعم لغة البرمجة دالة الخريطة، يجب أن تدعم تمرير دالة كمعامل. غير أن هناك بعض الصعوبات في التنفيذ عند تمرير الدوال كمعاملات أو إعادتها كنتائج، خاصةً عند وجود متغيرات غير محلية مُضافة في الدوال المتداخلة والمجهولة. عُرفت هذه المشكلة تاريخيًا باسم مشكلة فونارج.جويل موزس. "The Function of FUNCTION in LISP, or Why the FUNARG Problem Should be Called the Environment Problem". MIT AI Memo 199, 1970.  يُمكن تجنب حدوث هذه المشكلة في لغات البرمجة البدائية التي تعتمد على الأوامر إما عن طريق عدم دعم الدوال كأنواع نتائج (كما في لغة خوارزم 60 ولغة باسكال) أو من خلال حذف الدوال المتداخلة وبالتالي المتغيرات غير المحلية (كما في لغة سي). اتبعت لغة ليسب الوظيفية المبكرة نهج المجال الديناميكي، حيث تُشير المتغيرات غير المحلية إلى أقرب تعريف لذلك المتغير عند تنفيذ الدالة، بدلاً من مكان تعريفها، على حين دعمت لغة سكيم الدوال من الدرجة الأولى ذات المجال المعجمي، والتي تتطلب التعامل مع مراجع الدوال كإغلاقات بدلاً من مؤشرات الدوال المجردة، مما يجعل عملية جمع القمامة ضرورية.

 مراجع 



تصنيف:الوظائف الفرعية
تصنيف:أنواع البيانات
تصنيف:برمجة وظيفية
تصنيف:حسابات اللامدا
تصنيف:علم الحاسوب
تصنيف:بناء المصرفات
تصنيف:نظرية لغات البرمجة