تم إطلاق نسخة نوفمبر 2012 من لغة كلمات، وفيها أنواع جديدة من التعبيرات: الإجراء كذا، الدالة كذا. مثلاً لو قلت:
سوف تجد في المتغير س كائناً object يسمح لي باستدعاء الإجراء 'ترحيب' متى أردت. وكذلك ص يحمل وسيلة لاستدعاء الدالة 'مجموع' استدعيهما هكذا:
السطر الأول يطبع الترحيب على الشاشة، والسطر الثاني يضع القيمة 15 في المتغير ب.
لماذا قلنا "س: تنفيذها( ) " في أول سطر بينما قلنا "ب = ص: تنفيذها(...)" في الثاني؟ لأن س تعبر عن إجراء بينما ص تعبر عن دالة.
الآن ما فائدة هذا الاسلوب في إيجاد قيم تعبر عن الإجراءات والدوال؟ هيا نضرب مثلاً ظريفاً:
ماذا فعلنا؟ الدالة كلهم تأخذ مصفوفة ودالة اخرى اختبارية (تعود بالقيمة صحيح أو خطأ)، وتقوم بتطبيق الدالة على كل قيمة في المصفوفة، بحيث لو عادت تلك الدالة بـصحيح لكل القيم، تعود الدالة الأم أيضاً بـصحيح، وإلا عادت بـخطأ.
والآن لم تعد تحتاج كتابة هذا الـ loop مرة أخرى للتأكد أن شرطاً ما ينطبق على كل القيم في مصفوفة!
الأجمل من هذا أن كلمات سوف يكون بها مكتبة جاهزة فيها الدالة كلهم، بالإضافة لدوال أخرى شبيهة هي بعضهم، ليس.كلهم، كلهم.ليسوا ، بحيث يكون اختبار القيم في المصفوفات بسهولة كتابة سطر واحد في كثير من الأحيان.
لحظة...سطر واحد؟ ألم أضطر لكتابة الدالة زوجي في المثال السابق؟ هذا يجعل الموضوع يأخذ أكثر من سطر واحد للأسف :(
حسناً، في الواقع لم أكن أحتاج لذلك، لأن كلمات بها أيضاً تعبيرات لامدا (lambda expressions)، وهي طريقة لكي أعرف دالة بلا اسم في المكان الذي أريد فيه قيمة تعبر عن دالة.
أي أنه بدلا من "اطبع كلهم(م، الدالة زوجي)" كان يمكن أن أقول:
هذه هي صيغة الـ Lambda expression :
λ متغيرات: تعبير ينتج منه قيمة
ومعناها "الدالة التي تأخذ هذه المتغيرات كعوامل وترجع بقيمة هذا التعبير". مثلاً λ س: س+1 هي الدالة التي لو أخذت س تعود بـ س+1.
(لكي تكتب علامة لامدا في محرر كلمات اضغط زر Ctrl + L، لو كنت تستخدم محرراً آخر يمكنك إدخال رمز ^ بدلاً من لامدا)
في مثال "كلهم" قد مررت للدالة "كلهم" دالة أخرى، هي "الدالة التي لو أخذت أ تعود بالقيمة باقي.قسمة(أ،2)=0"، وهو نفس الدور الذي تقوم به الدالة زوجي -- التي لم نعد نحتاج إليها.
هل تريد أن تتأكد أن المصفوفة م لا تحتوي صفراً؟ بسيطة:
نحن هكذا نحاول أن ندخل بكلمات إلى عصر جديد: عصر الـfunctional programming.
أليس هذا صعباً على الأطفال؟ من يدري؟ نحن لم نجرب بعد. وعلى كل حال إن ظهر أن تلك الإمكانية صعبة فلا بأس: يمكننا أن نتركها في اللغة لكن لا نلزم الأطفال بتعلمها، وباقي اللغة متاحة لهم كما هي. ومن أراد من الكبار (أو الأطفال القادرين) أن يتعلمها فهي موجودة.
الدوال التي تأخذ دوالاً أخرى كعوامل تسمى higher order functions. مثال آخر لمثل هذه الدوال هو الدالة تناظر:
هذه الكود سوف تطبع على الشاشة [2، 4، 6، 8] لأن تناظر تأخذ مصفوفة ودالة، وتعود بمصفوفة أخرى مليئة بقيم المصفوفة الأولى بعد تطبيق الدالة على كل منها. أي أن كل قيمة في المصفوفة القديمة لها قيمة مناظرة لها في المصفوفة الجديدة.
مثال آخر هو الدالة اختزال :
الكود السابقة سوف تطبع على الشاشة القيمة 10، لأن اختزال تأخذ مصفوفة ودالة، ثم تقوم بطبيق الدالة "بين العناصر" كأني في المثال السابق حسبت 1+2+3+4. طبعاً كان يمكنني أن أقدم دالة ضرب بدلاً من الجمع لأحسب حاصل ضرب الأعداد في المصفوفة) أو دالة max لأحسب أكبر قيمة في المصفوفة..أو...أو...
الأسم "تناظر" هو ما أطلقته - في محاولة للتعريب - على الدالة المعروفة بإسم map، والدالة "اختزال" هي reduce.
ربما تكون قد سمعت عن MapReduce. إنها تكنولوجياً مبني عليها كثير من التطبيقات في شركات مثل:
هل تريد أن نبني جوجل خاصة بنا في مجتمعنا؟ لغة كلمات بها البذور العلمية لذلك لغرسها في الأطفال.
إجراء ترحيب( ): اطبع "مرحباً بك" نهاية دالة مجموع (أ ، ب): ارجع ب: أ + ب نهاية س = الإجراء ترحيب ص = الدالة مجموع
سوف تجد في المتغير س كائناً object يسمح لي باستدعاء الإجراء 'ترحيب' متى أردت. وكذلك ص يحمل وسيلة لاستدعاء الدالة 'مجموع' استدعيهما هكذا:
س : تنفيذها ( ) ب = ص : تنفيذها (5، 10)
السطر الأول يطبع الترحيب على الشاشة، والسطر الثاني يضع القيمة 15 في المتغير ب.
لماذا قلنا "س: تنفيذها( ) " في أول سطر بينما قلنا "ب = ص: تنفيذها(...)" في الثاني؟ لأن س تعبر عن إجراء بينما ص تعبر عن دالة.
الآن ما فائدة هذا الاسلوب في إيجاد قيم تعبر عن الإجراءات والدوال؟ هيا نضرب مثلاً ظريفاً:
دالة كلهم (المصفوفة ، الاختبار) : لكل أ من 1 إلى عدد (المصفوفة) : إذا ليس الاختبار : تنفيذها (المصفوفة [أ]) : ارجع ب: خطأ تم تابع ارجع ب: صحيح نهاية دالة زوجي (ر) : ارجع ب: باقي.قسمة (ر، 2) = 0 نهاية م = [2 ، 8 ، 6 ، 12] اطبع كلهم (م، الدالة زوجي)
ماذا فعلنا؟ الدالة كلهم تأخذ مصفوفة ودالة اخرى اختبارية (تعود بالقيمة صحيح أو خطأ)، وتقوم بتطبيق الدالة على كل قيمة في المصفوفة، بحيث لو عادت تلك الدالة بـصحيح لكل القيم، تعود الدالة الأم أيضاً بـصحيح، وإلا عادت بـخطأ.
والآن لم تعد تحتاج كتابة هذا الـ loop مرة أخرى للتأكد أن شرطاً ما ينطبق على كل القيم في مصفوفة!
الأجمل من هذا أن كلمات سوف يكون بها مكتبة جاهزة فيها الدالة كلهم، بالإضافة لدوال أخرى شبيهة هي بعضهم، ليس.كلهم، كلهم.ليسوا ، بحيث يكون اختبار القيم في المصفوفات بسهولة كتابة سطر واحد في كثير من الأحيان.
لحظة...سطر واحد؟ ألم أضطر لكتابة الدالة زوجي في المثال السابق؟ هذا يجعل الموضوع يأخذ أكثر من سطر واحد للأسف :(
حسناً، في الواقع لم أكن أحتاج لذلك، لأن كلمات بها أيضاً تعبيرات لامدا (lambda expressions)، وهي طريقة لكي أعرف دالة بلا اسم في المكان الذي أريد فيه قيمة تعبر عن دالة.
أي أنه بدلا من "اطبع كلهم(م، الدالة زوجي)" كان يمكن أن أقول:
اطبع كلهم (م، λ أ : باقي.قسمة (أ، 2) = 0)
هذه هي صيغة الـ Lambda expression :
λ متغيرات: تعبير ينتج منه قيمة
ومعناها "الدالة التي تأخذ هذه المتغيرات كعوامل وترجع بقيمة هذا التعبير". مثلاً λ س: س+1 هي الدالة التي لو أخذت س تعود بـ س+1.
(لكي تكتب علامة لامدا في محرر كلمات اضغط زر Ctrl + L، لو كنت تستخدم محرراً آخر يمكنك إدخال رمز ^ بدلاً من لامدا)
في مثال "كلهم" قد مررت للدالة "كلهم" دالة أخرى، هي "الدالة التي لو أخذت أ تعود بالقيمة باقي.قسمة(أ،2)=0"، وهو نفس الدور الذي تقوم به الدالة زوجي -- التي لم نعد نحتاج إليها.
هل تريد أن تتأكد أن المصفوفة م لا تحتوي صفراً؟ بسيطة:
اطبع كلهم.ليسوا ( م ، λ أ : أ = 0 )
نحن هكذا نحاول أن ندخل بكلمات إلى عصر جديد: عصر الـfunctional programming.
أليس هذا صعباً على الأطفال؟ من يدري؟ نحن لم نجرب بعد. وعلى كل حال إن ظهر أن تلك الإمكانية صعبة فلا بأس: يمكننا أن نتركها في اللغة لكن لا نلزم الأطفال بتعلمها، وباقي اللغة متاحة لهم كما هي. ومن أراد من الكبار (أو الأطفال القادرين) أن يتعلمها فهي موجودة.
الدوال التي تأخذ دوالاً أخرى كعوامل تسمى higher order functions. مثال آخر لمثل هذه الدوال هو الدالة تناظر:
م = [ 1 ، 2 ، 3 ، 4 ]
اطبع تناظر ( م ، λ أ : أ × 2 )
هذه الكود سوف تطبع على الشاشة [2، 4، 6، 8] لأن تناظر تأخذ مصفوفة ودالة، وتعود بمصفوفة أخرى مليئة بقيم المصفوفة الأولى بعد تطبيق الدالة على كل منها. أي أن كل قيمة في المصفوفة القديمة لها قيمة مناظرة لها في المصفوفة الجديدة.
مثال آخر هو الدالة اختزال :
م = [ 1 ، 2 ، 3 ، 4 ]
اطبع اختزال ( م ، λ أ ، ب : أ + ب )
الكود السابقة سوف تطبع على الشاشة القيمة 10، لأن اختزال تأخذ مصفوفة ودالة، ثم تقوم بطبيق الدالة "بين العناصر" كأني في المثال السابق حسبت 1+2+3+4. طبعاً كان يمكنني أن أقدم دالة ضرب بدلاً من الجمع لأحسب حاصل ضرب الأعداد في المصفوفة) أو دالة max لأحسب أكبر قيمة في المصفوفة..أو...أو...
الأسم "تناظر" هو ما أطلقته - في محاولة للتعريب - على الدالة المعروفة بإسم map، والدالة "اختزال" هي reduce.
ربما تكون قد سمعت عن MapReduce. إنها تكنولوجياً مبني عليها كثير من التطبيقات في شركات مثل:
- Yahoo
- Microsoft
هل تريد أن نبني جوجل خاصة بنا في مجتمعنا؟ لغة كلمات بها البذور العلمية لذلك لغرسها في الأطفال.
ليست هناك تعليقات:
إرسال تعليق