وظيفة مجهولة المصدر

في برمجة الحاسوب ، الدالة المجهولة (أو الدالة الحرفية ، أو دالة لامدا ، أو الكتلة ) هي تعريف دالة غير مرتبطة بمعرّف . غالبًا ما تُستخدم الدوال المجهولة كوسائط تُمرر إلى دوال من الرتبة العليا ، أو تُستخدم لإنشاء نتيجة دالة من الرتبة العليا تحتاج إلى إرجاع دالة. [ 1 ] إذا استُخدمت الدالة مرة واحدة فقط، أو لعدد محدود من المرات، فقد تكون الدالة المجهولة أخفّ من الناحية التركيبية من استخدام دالة مُسماة. تنتشر الدوال المجهولة في لغات البرمجة الوظيفية وغيرها من اللغات التي تدعم الدوال من الدرجة الأولى ، حيث تؤدي نفس دور القيم الحرفية لأنواع البيانات الأخرى .

تعود أصول الدوال المجهولة إلى عمل ألونزو تشيرش في ابتكاره لحساب لامدا ، الذي تُعدّ فيه جميع الدوال مجهولة، عام 1936، قبل ظهور الحواسيب الإلكترونية. [ 2 ] في العديد من لغات البرمجة، تُعرّف الدوال المجهولة باستخدام الكلمة المفتاحية lambda ، وغالبًا ما يُشار إليها باسم لامدا أو تجريدات لامدا . وقد أصبحت الدوال المجهولة سمةً من سمات لغات البرمجة منذ لغة ليسب عام 1958، ويدعم عدد متزايد من لغات البرمجة الحديثة الدوال المجهولة.

الأسماء

تشير المصطلحات "التجريد اللامدا" و"دالة لامدا" و"تعبير لامدا" إلى ترميز تجريد الدوال في حساب التفاضل والتكامل اللامدا، حيث الدالة المعتادةو(x)=م{\displaystyle f(x)=M}سيكتب(λx.م){\displaystyle (\lambda xM)}وحيثم{\displaystyle M}هو تعبير يستخدمx{\displaystyle x}قارن ذلك بصيغة بايثون الخاصة بـ .lambdax:M

يشير اسم "دالة السهم" إلى الرمز الرياضي " يُطابق إلى ".xم{\displaystyle x\mapsto M}قارن ذلك بصيغة جافا سكريبت الخاصة بـ [ 3 ]x=>M

الاستخدامات

يمكن للدوال المجهولة أن تغلف وظائف لا تتطلب تسمية، وهي مخصصة للاستخدام قصير المدى أو المحدود. ومن الأمثلة البارزة على ذلك الدوال المغلقة (closures) والدوال الجزئية (currying) .

يُعدّ استخدام الدوال المجهولة مسألة أسلوبية، ولا يُمثّل استخدامها الحلّ الوحيد لأيّ مشكلة؛ إذ يُمكن تعريف كلّ دالة مجهولة كدالة مُسمّاة واستدعاؤها باسمها. غالبًا ما تُوفّر الدوال المجهولة صيغةً مختصرةً مقارنةً بتعريف الدوال المُسمّاة. في اللغات التي لا تسمح بتعريف الدوال المُسمّاة في النطاقات المحلية، قد تُوفّر الدوال المجهولة تغليفًا عبر النطاق المحلي، إلا أن الكود الموجود في جسم هذه الدوال المجهولة قد لا يكون قابلاً لإعادة الاستخدام أو للاختبار بشكل منفصل. قد تكون الدوال المجهولة القصيرة/البسيطة المُستخدمة في التعبيرات أسهل قراءةً وفهمًا من الدوال المُسمّاة المُعرّفة بشكل منفصل، مع العلم أن افتقارها إلى اسم وصفي قد يُقلّل من سهولة قراءة الكود.

في بعض لغات البرمجة، يتم تنفيذ الدوال المجهولة بشكل شائع لأغراض محددة للغاية مثل ربط الأحداث بردود الاتصال أو إنشاء الدالة لقيم معينة، وهو ما قد يكون أكثر كفاءة في لغة البرمجة الديناميكية ، وأكثر قابلية للقراءة، وأقل عرضة للأخطاء من استدعاء دالة مسماة.

الأمثلة التالية مكتوبة بلغة بايثون 3.

فرز

توفر العديد من لغات البرمجة دالةً عامةً لترتيب قائمة (أو مصفوفة) من العناصر وفقًا لترتيب تحدده دالة مقارنة تقارن عنصرين لتحديد ما إذا كانا متساويين أو ما إذا كان أحدهما أكبر أو أصغر من الآخر. غالبًا ما يكون استخدام تعبير دالة مقارنة مجهولة ، يتم تمريره كوسيط لدالة فرز عامة، أكثر اختصارًا من إنشاء دالة مقارنة مُسماة.

لنفترض أن لدينا كود بايثون هذا يقوم بفرز قائمة من السلاسل النصية حسب طول السلسلة:

a : list [ str ] = [ "house" , "car" , " bike" ] a.sort ( key = lambda x : len ( x )) print ( a ) # يطبع ['car ' , 'bike', 'house']

الدالة المجهولة في هذا المثال هي تعبير لامدا:

lambda x : len ( x )

تقبل الدالة المجهولة وسيطًا واحدًا، x، وتعيد طول وسيطها، والذي تستخدمه الطريقة بعد ذلك sort()كمعيار للفرز.

الصيغة الأساسية لدالة لامدا في بايثون هي

lambda arg1 , arg2 , arg3 , ... : < عملية على الوسائط تُرجع قيمة >

يمكن تعيين التعبير الذي تُرجعه دالة lambda إلى متغير واستخدامه في الكود في أماكن متعددة.

من typing استورد Callableدالة الجمع : دالة قابلة للاستدعاء [[ عدد صحيح عدد صحيح ] = lambda a : a + a print ( add ( 20 )) # تطبع 40

مثال آخر هو فرز العناصر في قائمة حسب اسم فئتها (في بايثون، كل شيء له فئة):

a : list [ int | str ] = [ 10 , " number" , 11.2 ] a.sort ( key = lambda x : x .__ class __.__ name__ ) print ( a ) # يطبع [11.2, 10, 'number' ]

لاحظ أن 11.2اسم الفئة هو " float10واسم الفئة هو " int'number'واسم الفئة هو " str". الترتيب المُرتب هو " float"، " int"، ثم " " str".

عمليات الإغلاق

الدوال المغلقة هي دوال يتم تقييمها في بيئة تحتوي على متغيرات مرتبطة . المثال التالي يربط المتغير "threshold" داخل دالة مجهولة تقارن قيم الإدخال بهذا الحد.

دالة comp ( threshold : int ) -> Callable [[ int ], bool ]: return lambda x : x < threshold

يمكن استخدام هذا كنوع من مولدات دوال المقارنة:

func_a : Callable [[ int ], bool ] = comp ( 10 ) func_b : Callable [[ int ], bool ] = comp ( 20 )print ( func_a ( 5 ), func_a ( 8 ), func_a ( 13 ), func_a ( 21 )) # يطبع True True False Falseprint ( func_b ( 5 ), func_b ( 8 ), func_b ( 13 ), func_b ( 21 )) # يطبع True True True False

سيكون من غير العملي إنشاء دالة لكل دالة مقارنة محتملة، وقد يكون من غير الملائم الاحتفاظ بالحد الأدنى لاستخدامه لاحقًا. بغض النظر عن سبب استخدام الإغلاق، فإن الدالة المجهولة هي الكيان الذي يحتوي على الوظيفة التي تُجري المقارنة.

الكاري

تُحوّل تقنية "التقسيم الجزئي" دالة تأخذ عدة وسائط إلى سلسلة من الدوال، كل منها تقبل وسيطًا واحدًا. في هذا المثال، يتم تحويل دالة تُجري عملية القسمة على أي عدد صحيح إلى دالة تُجري عملية القسمة على مجموعة محددة من الأعداد الصحيحة.

دالة القسمة ( س : عدد صحيح ، ص : عدد صحيح ) -> عدد عشري : تُرجع س / صدالة divisor ( d : int ) -> Callable [[ int ], float ]: return lambda x : divide ( x , d )half : Callable [[ int ], float ] = divisor ( 2 ) third : Callable [[ int ], float ] = divisor ( 3 )print ( half ( 32 ), third ( 32 )) # يطبع 16.0 10.666666666666666print ( half ( 40 ), third ( 40 )) # يطبع 20.0 13.333333333333334

على الرغم من أن استخدام الدوال المجهولة ليس شائعًا في تقنية التخصيص الجزئي (Currying)، إلا أنه لا يزال ممكنًا. في المثال أعلاه، تُنشئ الدالة divisor دوالًا بمُقسّم مُحدد. تُخصّص الدالتان half و third دالة القسمة بمُقسّم ثابت.

تشكل دالة القسمة أيضًا إغلاقًا عن طريق ربط المتغير d.

الدوال ذات الرتبة العليا

الدالة ذات الرتبة العليا هي دالة تأخذ دالة أخرى كمعامل أو تُرجع دالة أخرى كنتيجة. تُستخدم هذه التقنية بكثرة لتخصيص سلوك دالة عامة، مثل حلقة تكرار أو نمط استدعاء ذاتي. تُعد الدوال المجهولة طريقة ملائمة لتحديد معاملات هذه الدوال. الأمثلة التالية مكتوبة بلغة بايثون 3.

رسم خريطة

تقوم دالة map باستدعاء دالة على كل عنصر من عناصر القائمة. يوضح المثال التالي كيفية تربيع كل عنصر في مصفوفة باستخدام دالة مجهولة.

a : list [ int ] = [ 1 , 2 , 3 , 4 , 5 , 6 ] print ( list ( map ( lambda x : x * x , a ))) # يطبع [1, 4, 9, 16, 25, 36]

تأخذ الدالة المجهولة وسيطًا وتعيد مربعه. لا يُشجع مُصممو اللغة على استخدام الصيغة المذكورة أعلاه، إذ يرون أن الصيغة الموضحة أدناه تحمل المعنى نفسه وتتوافق بشكل أكبر مع فلسفة اللغة.

a : list [ int ] = [ 1 , 2 , 3 , 4 , 5 , 6 ] print ([ x * x for x in a ]) # يطبع [1, 4, 9, 16, 25, 36]

فلتر

تقوم دالة التصفية بإرجاع جميع العناصر من القائمة التي تُقيّم بـ "صحيح" عند تمريرها إلى دالة معينة.

a : list [ int ] = [ 1 , 2 , 3 , 4 , 5 , 6 ] print ( list ( filter ( lambda x : x % 2 == 0 , a ))) # يطبع [2, 4, 6]

تتحقق الدالة المجهولة مما إذا كان الوسيط المُمرر إليها زوجيًا. وكما هو الحال مع دالة map، يُعتبر الشكل التالي أكثر ملاءمة:

a : list [ int ] = [ 1 , 2 , 3 , 4 , 5 , 6 ] print ([ x for x in a if x % 2 == 0 ]) # يطبع [2, 4, 6]

طية

تُنفَّذ دالة الطي على جميع عناصر البنية (عادةً من اليسار إلى اليمين في القوائم، وتُسمى "الطي الأيسر" reduceفي بايثون)، وتُجمِّع قيمةً أثناء تنفيذها. يمكن استخدام هذه الدالة لدمج جميع عناصر البنية في قيمة واحدة، على سبيل المثال:

a : list [ int ] = [ 1 , 2 , 3 , 4 , 5 ] print ( functools.reduce ( lambda x , y : x * y , a ) ) # يطبع 120

هذا يؤدي

(((1×2)×3)×4)×5=120.{\displaystyle \left(\left(\left(1\times 2\right)\times 3\right)\times 4\right)\times 5=120.}

الدالة المجهولة هنا هي ضرب الوسيطين.

لا ينتج عن عملية الطي بالضرورة قيمة عددية واحدة؛ بل يمكنها أيضًا توليد نتائج مُهيكلة مثل القوائم. ويمكن إنشاء كل من دالتي الخريطة والتصفية باستخدام الطي. في دالة الخريطة، تكون القيمة المُجمّعة قائمة جديدة تحتوي على نتائج تطبيق دالة على كل عنصر من عناصر القائمة الأصلية. أما في دالة التصفية، فتكون القيمة المُجمّعة قائمة جديدة تحتوي فقط على العناصر التي تُطابق الشرط المُحدد.

قائمة اللغات

فيما يلي قائمة بلغات البرمجة التي تدعم الدوال المجهولة غير المسماة بشكل كامل، أو جزئياً كنوع من أنواعها، أو لا تدعمها على الإطلاق.

يوضح الجدول التالي عدة أنماط شائعة. ومن الجدير بالذكر أن لغات مثل C وباسكال وأوبجكت باسكال - التي لا تدعم تقليديًا الدوال المجهولة - هي لغات ذات كتابة ثابتة . ومع ذلك، يمكن للغات ذات الكتابة الثابتة دعم الدوال المجهولة. على سبيل المثال، لغات ML ذات كتابة ثابتة وتتضمن أساسًا دوالًا مجهولة، وقد تم توسيع لغة دلفي ، وهي لهجة من أوبجكت باسكال ، لدعم الدوال المجهولة، وكذلك لغة C++ (بموجب معيار C++11 ). ثانيًا، اللغات التي تعامل الدوال كدوال من الدرجة الأولى ( ديلان ، هاسكل ، جافا سكريبت ، ليسب ، ML ، بيرل ، بايثون ، روبي ، سكيم ) تدعم عمومًا الدوال المجهولة بحيث يمكن تعريف الدوال وتمريرها بسهولة مثل أنواع البيانات الأخرى.

أمثلة

انظر أيضاً

مراجع

  1. "الدوال ذات الرتبة العليا" . learnyouahaskell.com . تم الاطلاع عليه بتاريخ 3 ديسمبر 2014 .
  2. فرنانديز، ماريبيل (2009)، نماذج الحوسبة: مقدمة في نظرية الحوسبة ، مواضيع جامعية في علوم الحاسوب، سبرينغر ساينس آند بيزنس ميديا، ص 33، ISBN  9781848824348تم تقديم حساب لامدا ... من قبل ألونسو تشيرش في ثلاثينيات القرن العشرين كتدوين دقيق لنظرية الدوال المجهولة
  3. "تعبيرات دالة السهم - جافا سكريبت" . MDN . تم الاطلاع عليه بتاريخ 21 أغسطس 2019 .
  4. "أنواع الوصول" . www.adaic.org . تم الاطلاع عليه بتاريخ 27-06-2024 .
  5. "Bash lambda" . GitHub . 2019-03-08.
  6. بيل واغنر. "تعبيرات لامدا - مرجع لغة سي شارب" . docs.microsoft.com . تم الاطلاع عليه بتاريخ 24-11-2020 .
  7. "دعم الإغلاق" . مؤرشف من الأصل بتاريخ 2014-01-06 . تم الاسترجاع بتاريخ 2014-01-05 .
  8. "ما الجديد في ColdFusion 10" . مؤرشف من الأصل بتاريخ 2014-01-06 . تم الاطلاع عليه بتاريخ 2014-01-05 .
  9. "كلوجر - الدوال ذات الرتبة العليا" . clojure.org . تم الاطلاع عليه بتاريخ 14 يناير 2022 .
  10. "مرجع لغة كوبول المُدارة" . وثائق مايكرو فوكس . مايكرو فوكس . تم الاطلاع عليه بتاريخ 25 فبراير 2014 .{{cite web}}: CS1 maint: deprecated archiveal service ( link )
  11. "الدوال - لغة البرمجة D" . dlang.org . تم الاطلاع عليه بتاريخ 14 يناير 2022 .
  12. "جولة في لغة دارت" . dart.dev . تم الاطلاع عليه بتاريخ 24-11-2020 .
  13. "الأساليب المجهولة في دلفي - استوديو RAD" . docwiki.embarcadero.com . تم الاطلاع عليه بتاريخ 24-11-2020 .
  14. "الدوال - برمجة ديلان" . opendylan.org . تم الاطلاع عليه بتاريخ 14 يناير 2022 .
  15. "docs/syntax" . elm-lang.org . تم الاطلاع عليه بتاريخ 14 يناير 2022 .
  16. "قواعد لغة إرلانج/إليكسير: دورة مكثفة" . elixir-lang.github.com . تم الاطلاع عليه بتاريخ 24 نوفمبر 2020 .
  17. "Erlang -- Funs" . erlang.org . تم الاطلاع عليه بتاريخ 24-11-2020 .
  18. كارترمب. "تعبيرات لامدا: الكلمة المفتاحية الممتعة - F#" . docs.microsoft.com . تم الاسترجاع في 24 نوفمبر 2020 .
  19. "دالة لامدا: أفضل دالة في جداول بيانات إكسل" . microsoft.com . 25 يناير 2021. تاريخ الاسترجاع: 30 مارس 2021 .
  20. "الاقتباسات - توثيق العامل" . تم الاطلاع عليه بتاريخ 26 ديسمبر 2015. الاقتباس هو دالة مجهولة (قيمة تشير إلى جزء من التعليمات البرمجية) يمكن استخدامها كقيمة واستدعاؤها باستخدام مُركِّبات Fundamental.
  21. "Frink" . frinklang.org . تم الاطلاع عليه بتاريخ 24-11-2020 .
  22. "الدوال المجهولة في لغة غولانغ" . وثائق غولانغ . 9 يناير 2020. تم الاطلاع عليه بتاريخ 24 نوفمبر 2020 .
  23. "وثائق غوسو" (ملف PDF) . تم الاطلاع عليه بتاريخ 4 مارس 2013 .
  24. "توثيق Groovy" . مؤرشف من الأصل في 22 مايو 2012. تم الاطلاع عليه في 29 مايو 2012 .
  25. "دالة مجهولة - هاسكل ويكي" . wiki.haskell.org . تم الاطلاع عليه بتاريخ 14 يناير 2022 .
  26. "لامدا" . هاكس - مجموعة أدوات متعددة المنصات . تم الاسترجاع في 14 يناير 2022 .
  27. "الدوال - جافا سكريبت | MDN" . developer.mozilla.org . تم الاطلاع عليه بتاريخ 14 يناير 2022 .
  28. "الدوال · لغة جوليا" . docs.julialang.org . تم الاطلاع عليه بتاريخ 24-11-2020 .
  29. "الدوال ذات الرتبة العليا وتعبيرات لامدا - لغة برمجة كوتلن" . كوتلن . تم الاطلاع عليه بتاريخ 24-11-2020 .
  30. "البرمجة بلغة لوا : 6" . www.lua.org . تم الاطلاع عليه بتاريخ 24-11-2020 . 
  31. "برمجة مابل: 1.6: الدوال والتعبيرات المجهولة - مركز التطبيقات" . www.maplesoft.com . تاريخ الاسترجاع: 24 نوفمبر 2020 .
  32. "الدوال المجهولة - MATLAB و Simulink" . www.mathworks.com . تم الاطلاع عليه بتاريخ 14 يناير 2022 .
  33. "دليل ماكسيما 5.17.1: 39. تعريف الدالة" . maths.cnam.fr . تم الاطلاع عليه بتاريخ 24-11-2020 .
  34. "دليل لغة نيم" . nim-lang.github.io .
  35. "أمثلة برمجية - OCaml" . ocaml.org . تم الاطلاع عليه بتاريخ 24-11-2020 .
  36. "GNU Octave: Anonymous Functions" . octave.org . تم الاطلاع عليه بتاريخ 24-11-2020 .
  37. "القيم الحرفية للدوال" . دليل مستخدم OpenSCAD . ويكي بوكس . تم الاطلاع عليه بتاريخ 22 فبراير 2021 .
  38. "perlsub - إجراءات فرعية في لغة بيرل - متصفح بيرلدوك" . perldoc.perl.org . تم الاطلاع عليه بتاريخ 24-11-2020 .
  39. "PHP: الدوال المجهولة - دليل المستخدم" . www.php.net . تاريخ الاسترجاع: 24-11-2020 .
  40. "6. التعبيرات — وثائق بايثون 3.9.0" . docs.python.org . تم الاطلاع عليه بتاريخ 24-11-2020 .
  41. "4.4 الدوال: لامدا" . docs.racket-lang.org . تم الاطلاع عليه بتاريخ 24-11-2020 .
  42. "الدوال" . docs.raku.org . تم الاطلاع عليه بتاريخ 14 يناير 2022 .
  43. سوسينسكي، روبرت (21-12-2008). "فهم كتل روبي، والإجراءات، وتعبيرات لامدا" . Reactive.IO. مؤرشف من الأصل في 31-05-2014 . تم الاطلاع عليه في 30-05-2014 .
  44. "الإغلاقات: الدوال المجهولة التي يمكنها التقاط بيئتها - لغة برمجة Rust" . doc.rust-lang.org . تم الاطلاع عليه بتاريخ 14 يناير 2022 .
  45. "الدوال المجهولة" . وثائق سكالا . تم الاطلاع عليه بتاريخ 14 يناير 2022 .
  46. "المراجعة الثالثة: الدوال ذات الرتبة العليا" . www.cs.cornell.edu . تم الاطلاع عليه بتاريخ 14 يناير 2022 .
  47. "الإغلاقات - لغة برمجة سويفت (سويفت 5.5)" . docs.swift.org .
  48. "التوثيق - أنواع يومية" . www.typescriptlang.org . تم الاطلاع عليه بتاريخ 14 يناير 2022 .
  49. "نوع الدالة - وثائق Typst" . typst.app . تم الاطلاع عليه بتاريخ 10-09-2024 .
  50. 1 2 "Projects/Vala/Tutorial - GNOME Wiki!" . wiki.gnome.org . تم الاطلاع عليه بتاريخ 24-11-2020 .
  51. كاثلين دولارد (15 سبتمبر 2021). "تعبيرات لامدا - فيجوال بيسك" . docs.microsoft.com . تم الاطلاع عليه بتاريخ 14 يناير 2022 .
  52. "مرجع اللغة/المصطلحات/المسندات المجهولة - wiki.visual-prolog.com" . wiki.visual-prolog.com . تم الاطلاع عليه بتاريخ 14 يناير 2022 .
  53. "الدالة المجهولة البحتة: مقدمة أساسية إلى لغة وولفرام" . www.wolfram.com . تم الاطلاع عليه بتاريخ 14 يناير 2022 .
  54. "اللامدا، والإغلاقات، وكل ما بينهما · العدد رقم 1048 · ziglang/zig" . GitHub . تم الاطلاع عليه بتاريخ 21 أغسطس 2023 .