عالم برمجةوتقنية الحاسوب C. P. W
742 subscribers
496 photos
55 videos
260 files
480 links
عالم الحاسوب برمجه وتقنيه وتطوير شرح كل ما يتطلب في مجال علوم الحاسوب والبرمجة
https://t.me/programming_C_w
قنات الجرافيكس @l_d_gh
#Digitalmarketing
#programming
#AI #CPA
#learn
التواصل معي @Eng_sharaf1
Download Telegram
‏14 من محركات البحث مدعومة بالذكاء الاصطناعي

▪️perplexityai
•منصة للإجابة على الأسئلة باستخدام الذكاء الاصطناعي، تقدم إجابات دقيقة ومفصلة مع مراجع وروابط للمصادر.

▪️ thinkanyai
•محرك البحث يحتوي على ميزات بحث مدمجة بالذكاء الاصطناعي لتقديم إجابات مفصلة مع تلخيصها في خرائط ذهنية

▪️ scinitoai
•محرك بحث للباحثين يوفر أكثر من ٢٤٠ مليون ورقة بحثية في مختلف المجالات ويوفر عدد كبير منها باللغة العربية (مميز جداً في هذه الجزئية)
يتيح الوصول الكامل للورقة البحثية والبحث عنها في google للوصول إليها من مصادر مختلفه ويوفر الاقتباسات

▪️ omniplexai
•محرك بحث مفتوح المصدر. يمكن من خلاله تحديد مجال البحث ومساره مثل أكاديمي أو YouTube أو ويكيبيديا أو reddit وغيرها.

▪️everypixel.com
•محرك بحث مخصص للصور يجمع بين العديد من مكتبات الصور، يساعد في العثور على الصور ذات الجودة العالية والأفكار الإبداعية.

▪️gensparkai
•محرك بحث يستخدم الذكاء الاصطناعي لتقديم إجابات دقيقة وشاملة في مجالات متعددة.

▪️gptgoai
•محرك بحث يستخدم تقنية GPT لتقديم إجابات دقيقة وشاملة، يساعد المستخدمين في العثور على الإجابات الموثوقة.

▪️you.com
•محرك بحث يقدم تجربة مخصصة مع نتائج تفاعلية وشخصية، يدمج بين البحث التقليدي والذكاء الاصطناعي

▪️explorer.globe.engineer
•محرك بحث يجمع المعرفة من مصادر متعددة بتنسيق يسهل فهمه، يشمل الرسومات البيانية والصور.

▪️Microsoft Copilot
•يجمع بين الذكاء الاصطناعي والبحث التقليدي لتقديم تجربة بحث شخصية وسريعة.

▪️Google Gemini
•يستخدم لتقديم إجابات شبيهة بالبشر ودقيقة، ويدعم إدخال الاستفسارات بأشكال متعددة مثل الصور والصوت .

▪️Andi
•محرك بحث مجاني يركز على الخصوصية ويستخدم تقنيات بحث دلالية، يقدم تجربة خالية من الإعلانات مع تلخيص للمعلومات .

▪️Exa.ai
•يستخدم نموذج لغة كبير لتصفية المحتوى بناءً على المعنى، يتيح تخصيص نتائج البحث حسب التاريخ والموقع والموضوع


▪️Phind
•مخصص للمطورين، يوفر نتائج دقيقة باستخدام تقنيات AI المتقدمة، يتضمن خيارات مجانية ومدفوعة مع ميزات إضافية
#شرح ما التحديثات على جملة switch ؟
في الاصدارات الجديده من جافا وتحديداً الاصدارات الأحدث من الاصدار 12 تم تحديث جملة switch واهم ما تم اضافته اليها الاتي :
1. امكانية استعمالها لاعادة قيمة .
int day = 3;
String dayName = switch (day) {
    case 1 -> "Sunday";
    case 2 -> "Monday";
    case 3 -> "Tuesday";
    case 4 -> "Wednesday";
    case 5 -> "Thursday";
    case 6 -> "Friday";
    case 7 -> "Saturday";
    default -> "non day";
};
في هذا المثال ستقوم التعليمة باعادة اسم يوم الاسبوع الى المتغير dayName اعتماداً على رقم اليوم .

2. استبدال التعبير ( <- )  بدلا من (:) والعبارة break .
int numLetters = switch (day) {
    case 1, 2, 3, 4, 5 -> 6;
    case 6, 7 -> 8;
    default -> 0;
};
ويمكن استخدام الاقواس عندما يكون لدينا اكثر من امر ، وفي هذه الحالة اذا اردنا ان نعيد قيمة نستعمل الامر yield .
String dayType = switch (day) {
    case 1, 7 -> "Weekend";
    case 2, 3, 4, 5, 6 -> {
        System.out.println("It's a weekday");
        yield "Weekday";
    }
    default -> "Nun";
};
تطوير لغات البرمجة لا يتوقف في مرحلة ما ولكن يتم مواكبة كل جديد في تعلم البرمجة لإضافة اي ميزات جديده .
تعتبر لغة الجافا من اقوى اللغات التي لا يستغنى عنها وينصح بها الاكادمين والمحترفين .
في لغة البرمجة بايثون، المكتبة requests تستخدم لإجراء طلبات HTTP. الأكواد التي يمكن أن تعود كاستجابة لهذه الطلبات تنقسم إلى عدة فئات وتوفر معلومات حول نتيجة الطلب. إليك شرح للفئات الرئيسية وبعض الأكواد المحددة التي قد تجدها مفيدة:

••• 1xx: معلوماتية •••
- 100 Continue: الخادم يقبل الجزء الأولي من الطلب ويطلب من العميل استكمال الطلب.
- 101 Switching Protocols: الخادم يقبل طلب التحول إلى بروتوكولات أخرى.

---------------------------------------
2xx: نجاح

- 200 OK: الطلب ناجح والجواب يحتوي على البيانات المطلوبة.
- 201 Created: الطلب ناجح وأدى إلى إنشاء مورد جديد.
- 202 Accepted: الطلب قد تم قبوله للمعالجة، لكن العملية لم تكتمل بعد.
- 204 No Content: الطلب ناجح لكن لا يوجد محتوى لإرساله في الرد.


---------------------------------------
••• 3xx: إعادة توجيه •••

- 300 Multiple Choices: الطلب يحتوي على خيارات متعددة يمكن أن يختار منها العميل.
- 301 Moved Permanently: المورد المطلوب قد تغير مكانه بشكل دائم.
- 302 Found: المورد المطلوب مؤقتًا تحت عنوان URL آخر.
- 304 Not Modified: المورد لم يتغير منذ آخر طلب ولا يحتاج إلى إعادة إرسال.

---------------------------------------
••• 4xx: أخطاء العميل •••

- 400 Bad Request: الطلب غير صحيح أو لا يمكن فهمه بواسطة الخادم.
- 401 Unauthorized: الطلب يتطلب التحقق من هوية المستخدم.
- 403 Forbidden: الطلب ممنوع والخادم يرفض الإجابة.
- 404 Not Found: المورد المطلوب غير موجود على الخادم.
- 405 Method Not Allowed: الطريقة المستخدمة في الطلب غير مسموح بها للمورد المطلوب.

---------------------------------------
••• 5xx: أخطاء الخادم•••

- 500 Internal Server Error: خطأ داخلي في الخادم يمنعه من تنفيذ الطلب.
- 501 Not Implemented: الخادم لا يدعم الطلب المقدم أو الطريقة المستخدمة.
- 502 Bad Gateway: الخادم كان يعمل كبوابة أو وكيل وتلقى استجابة غير صالحة.
- 503 Service Unavailable: الخدمة غير متوفرة مؤقتًا، عادةً بسبب الصيانة أو الحمل الزائد.
- 504 Gateway Timeout: الخادم كان يعمل كبوابة أو وكيل ولم يتلق استجابة في الوقت المحدد.

هذه بعض الأكواد الأساسية التي قد تواجهها أثناء استخدام المكتبة requests في بايثون للتعامل مع HTTP.
👍1
بعض لغات برمجة وأهداف كل منها ومع مثال بسيط

1. C:
- الهدف: لغة منخفضة المستوى تُستخدم لتطوير برمجيات ذات أداء عالي.
- مثال كود:

#include <stdio.h>

int main() {
printf("Hello, World!\n");
return 0;
}

- الشرح: يقوم هذا البرنامج بطباعة "Hello, World!" على الشاشة. #include <stdio.h> يُدرج مكتبة الإدخال والإخراج القياسية، وprintf يستخدم لطباعة النص.

2. C++:
- الهدف: لغة برمجة كائنية التوجه تُستخدم لتطوير برامج ذات أداء عالي.
- مثال كود:

#include <iostream>

int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}

- الشرح: يقوم هذا البرنامج بطباعة "Hello, World!" على الشاشة باستخدام std::cout من مكتبة الإدخال والإخراج القياسية.

3. Java:
- الهدف: لغة متعددة الاستخدامات تُستخدم في تطبيقات الويب والمحمولة.
- مثال كود:

public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}

- الشرح: يقوم هذا البرنامج بطباعة "Hello, World!" على الشاشة. System.out.println يُستخدم لطباعة النص.

4. Python:
- الهدف: لغة متعددة الأغراض تُستخدم في تطبيقات متنوعة مثل تطوير الويب وتحليل البيانات.
- مثال كود:

print("Hello, World!")

- الشرح: يقوم هذا البرنامج بطباعة "Hello, World!" على الشاشة باستخدام دالة print.

5. JavaScript:
- الهدف: لغة تُستخدم في تطوير الويب وتفاعل المستخدم.
- مثال كود:

console.log("Hello, World!");

- الشرح: يقوم هذا البرنامج بطباعة "Hello, World!" في وحدة التحكم الخاصة بالمتصفح.

6. Ruby:
- الهدف: لغة برمجة تُستخدم بشكل رئيسي في تطوير الويب.
- مثال كود:

puts "Hello, World!"

- الشرح: يقوم هذا البرنامج بطباعة "Hello, World!" على الشاشة باستخدام دالة puts.

7. Swift:
- الهدف: لغة تُستخدم لتطوير تطبيقات iOS وmacOS.
- مثال كود:

import Swift

print("Hello, World!")

- الشرح: يقوم هذا البرنامج بطباعة "Hello, World!" على الشاشة باستخدام دالة print.

8. PHP:
- الهدف: لغة تُستخدم في تطوير البرمجيات الجانبية للخادم على الويب.
- مثال كود:

<?php
echo "Hello, World!";
?>

- الشرح: يقوم هذا البرنامج بطباعة "Hello, World!" على صفحة الويب باستخدام دالة echo.

9. SQL:
- الهدف: لغة لإدارة قواعد البيانات العلائقية.
- مثال كود:

SELECT 'Hello, World!' AS Greeting;

- الشرح: يقوم هذا الاستعلام بإرجاع النص "Hello, World!" كعمود يسمى Greeting من قاعدة البيانات.

كل كود بسيط يعرض كيفية استخدام اللغة الأساسية لطباعة نص على الشاشة، وهو مثال جيد على كيفية بدء العمل مع كل لغة.
👍1
#شرح تكملة لل vararage :
في المنشور السابق ذكرنا انه يمكن تمرير اكثر من وسيط الى الدالة من نفس النوع فقط ؛ ولكن هل يمكن تمرير وسائط مختلفة الانواع ؟
الاجابة هي لا ، ولا يمكن ايضاً تمرير اكثر من vararage في نفس الوقت الكود التالي غير صحيح :
static void vara(int ...v1, String ...v2){}
إذا لا يمكن تمرير اكثر من vararage في وقت واحد ، لكن ماذا عن دالة printf التي تحدثنا عنها ، فهي تستقبل في البداية نصاً(String) ثم تستقبل انواع مختلفة قد تكون ارقاماً او نصوصاً ؟!
دعني اوضح لك الاجابة على قسمين ، القسم الاول هو كيف اجعلها تستقبل في البداية نصاً اجبارياً والمثال التالي يوضح ذلك :
static void myPrintf(String first, int ... vara){}
لاحظ اننا قمنا بارسال وسيط ثابت (ليس vararage ) قبل ارسال ال vararage وهذا مقبول في جافا ، والكود سيعمل بدون مشاكل .
حللنا الجزء الاول من المشكلة ، تبقى كيف نرسل انواع مختلفة من البيانات في ال vararage  ، الامر بسيط جدا ، فلغة جافا هي كائينية التوجه وكل فئاتها (classes) ترث من الفئة الام وهي Object ، لذلك تعديل الكود السابق سيكون كالتالي :
static void myPrintf(String first, Object ... vara){}
هذا الكود يشبه بالضبط كود تعريف دالة
System.out.printf();

ملاحظة اخيرة عن vararage :
اذا كان لدينا دالة تستقبل vararage كالتالي :
static int sum(int ... nums){
        int sum = 0;
        for(int i = 0; i < nums.length; i++){
            sum += nums[i];
        }
        return sum;
    }
فيمكن استخدامها بطريقتين ، الطريقة الاولى شرحتها في الموضوع السابق والطريقة الثانية هي بتمرير مصفوفة قيم جاهزة اليها كالتالي :
int[] array = new int[]{10, 20, 30, 50};
int total = sum(array);
في النهاية ، موضوع ال vararage موضوع قوي ويوفر ديناميكية كبيرة في التعامل مع الدوال .
1👍1
#شرح الوصول الى الدوال :
public static void sleep1(){
        System.out.print("zzz");
    }
    static void sleep2(){
        System.out.print("zzz");
    }
    public void sleep3(){
        System.out.print("zzz");
    }
    void sleep4(){
        System.out.print("zzz");
    }
ما الفرق بين الدوال الاربع السابقة ؟
في الحقيقة يمكن تعريف الدوال باي من الطرق السابقة ، لكن الفرق يكمن في امكانية الوصول اليها ، مثلا ، الدالة الاولى متاحة لجميع الدوال وجميع الفئات في اي مكان حرفياً - مادام تم استدعائها عبر import - .
الدالة الثانية يمكن الوصول اليها من جميع الدوال في نفس الفئة او يمكن استدعائها عبر import من نفس الحزمة package فقط ، ولا يمكن الوصول اليها من خارج الحزمة ابداً .

الدالة الثالثة تختلف عن سابقاتها بانها ليست static ، ما هي static بالضبط ، ساعطيكم مثالين .
دالة الاخراج ودالة الادخال .
Scanner in = new Scanner(System.in);
System.out.print ("");
in.next();
هلا لاحظت الفرق بين دالة print() و دالة next() ؟
الفرق ان print() استطعنا الوصول اليها مباشرة عبر مسارها System.out لكن next() لم نستطع الوصول اليها عبر مسارها مباشرة كالتالي
Scanner.next();
لذلك اضطررنا الى انشاء كائن من Scanner للوصول اليها ، والسبب في ذلك ان الدالة print() هي دالة static والدالة next() هي دالة ليست static وتسمى non-static وهذا الفرق بينهما ، وايضا لا يمكن في نفس الفئة (class ) ان تستدعي الدوال non-static من داخل الدالة الرئيسية كالتالي
public static void main(String[] args) {
        sleep3();
    }
فالكود السابق يسبب خطا ، لان الدالة sleep3() لا يمكن استدعائها الا بانشاء كائن من الفئة الاب لها ، والمثال التالي يوضح طريقة استدعائها
الكود بالكامل :
public class Main {
    public static void main(String[] args) {
        Main m = new Main();
        m.sleep3();
    }
    public void sleep3(){
        System.out.print("zzz");
    }
}
بالتاكيد الكود مفهوم ، فنحن قد سبق وأن تعاملنا مع الكائنات ، ولان الدالة sleep3 () عبارة عن public فيمكن الوصول اليها من اي مكان ! سيخطر على بالك سؤال ، الم تقل انه عندما نريد الوصول اليها  نعرف كائن من الفئة الاب لها ؟
الاجابة نعم ، لكن الدالة الرابعة ان قمت بتعريف كائن خارج الحزمة package فلن تستطيع الوصول اليها لانها ليست public ، وهذا موضوع آخر Access Modifiers وهو معدلات الوصول .
👍1
#شرح الانظمة المختلفة للارقام
في جافا وعدة لغات اخرى مثل c++ و c# و python يتم التعامل مع الارقام بانظمة مختلفة وفقاً لسابقات محددة توضع قبل الرقم .
مثلا ، نحن نعلم ان الحرف f يمثل الرقم 15 في النظام السادس عشر ، لكن كيف نقوم بطباعته ؟
اذا قمنا بطباعته كالتالي
System.out.print(f);
//   OR
System.out.print ("f");
في الدالة الاولى سيظهر لنا خطا لانه يتوقع ان يكون f اسماً لمتغير غير معرف ، اما في الدالة الثانية فسيطبعه كما هو f بدون تغيير .
لذلك لتفادي التضارب بين الارقام والنصوص وأسماء المتغيرات يتم عمل سابقة مخصصه لكل نظام .
|---|---|---|
| 16  |   8  |   2  |
|---|---|---|
| 0x  |   0  | 0b  |
|---|---|---|
الجدول السابق يوضح سابقات كل نظام ، ستلاحظ امرا غريباً في النظام الثماني ، وهو انه يبدا ب 0 فقط لذلك لا يمكننا طباعة الرقم التالي 09 او 08 لانه لا يوجد رقم 9 او 8 في هذا النظام ، ولا تتوقع ان يعتبره عدداً عشرياً فيطبعه 9 او 8 .
public class Main {
    public static void main(String[] args) {
        // Binary
        System.out.println(0b1010);
        // Octal
        System.out.println(07);
        // Decimal
        System.out.println(10);
        // Hex
        System.out.println(0xf);
    }
}

الآن بما أنك فهمت الانظمة العددية ، عليك البحث عن سبب مخرج الكود التالي :
System.out.println(123_456_78e-5);
👍1
اللهم ارحم شهداء فلسطين وشهداء غزة وأجعلهم من أهل الفردوس الأعلى، اللهم أجعل أطفال فلسطين الموتى شفعاء لأسرهم يوم القيامة.
1
المواقع على الانترنت مفيدة جداً ، ولكن برغم فائدتها تواجهنا مشكلة وهي بطئ الإنترنت.
حل المشكلة! قم بتحميل الموقع بالكامل الى جهازك (:
لتحميل موقع w3schools بالكامل ، يبلغ حجمة 32MB مضغوط، عند فك الضغط يكبر الى 1.46GB
حمل الملف من هنا ثم قم بفك الضغط وافتح ملف index على جهازك .
#روابط
🖥 فيما يلي قائمة بأحدث مجموعات التكنولوجيا الرائجة في عام 2024

1 ⁃ تطوير الواجهة الأمامية:
⁃ React.js:
⁃ الوصف : معروف بهندسته المعمارية القائمة على المكونات ودعم المجتمع القوي.
⁃ Vue.js:
⁃ الوصف : تقدر ببساطتها ومرونتها في بناء واجهات المستخدم.
⁃ Angular:
⁃ الوصف : لا تزال تستخدم على نطاق واسع ، وخاصة في تطبيقات المؤسسة.

2 ⁃ تطوير الواجهة الخلفية :
⁃ Node.js:
⁃ الوصف : شعبية لبناء تطبيقات شبكة قابلة للتطوير وسريعة باستخدام جافا سكريبت.
⁃ Django:
⁃ الوصف : يفضل لقدرات التطوير السريع وميزات الأمان القوية.
⁃ Spring Boot:
⁃ الوصف : تستخدم على نطاق واسع في التطبيقات المستندة إلى جافا لسهولة الاستخدام وقدرات التكامل.

3 ⁃ تطوير المحمول :
⁃ Flutter:
⁃ الوصف : معروف ببناء تطبيقات مجمعة أصلا للجوال والويب وسطح المكتب من قاعدة بيانات واحدة.
⁃ React Native :
⁃ الوصف : لا تزال شعبية لبناء تطبيقات عبر منصة With mother's abilities .

4 ⁃ الحوسبة السحابية و DevOps :

⁃ الوصف : AWS (خدمات أمازون ويب),Azure ، Google Cloud:
مقدمو الخدمات السحابية الرائدون الذين يقدمون خدمات واسعة النطاق للحوسبة والتخزين والشبكات.
⁃ Docker and Kubernetes:
⁃ الوصف : ضروري للحاويات وتزامن التطبيقات في بيئة سحابية أصلية.
⁃ Terraform:
⁃ الوصف : البنية التحتية كأداة رمز لإدارة وتوفير البنية التحتية السحابية.

5 ⁃ علم البيانات والتعلم الآلي :
⁃ Python:
⁃ الوصف : اللغة السائدة لعلوم البيانات والتعلم الآلي ، مع المكتبات مثل نومبي ، الباندا ، و سكيت-تعلم.
- تنسورفلو وبيتورش: الأطر الرائدة لبناء وتدريب نماذج التعلم الآلي.
⁃ Apache Spark:
⁃ الوصف : تستخدم لمعالجة البيانات الكبيرة والتحليلات.

6 ⁃ Cybersecurity:
⁃ الوصف : أدوات سيم (المعلومات الأمنية وإدارة الأحداث): مثل سبلونك و إلك ستاك ، حاسمة لرصد وإدارة الحوادث الأمنية.
⁃ Zero Trust Architecture:
⁃ الوصف : نموذج أمان يلغي فكرة الثقة بناء على موقع الشبكة.

7⁃ بلوكتشين والعملات المشفرة :
⁃ Ethereum:
⁃ الوصف : منصة بلوكتشين تدعم العقود الذكية والتطبيقات اللامركزية.
⁃ Hyperledger Fabric:
⁃ الوصف : إطار عمل لتطوير التطبيقات المسموح بها والقائمة على بلوكتشين.

8 ⁃ الذكاء الاصطناعي ومعالجة اللغة الطبيعية:

⁃ GPT (Generative Pre-trained Transformer) Models:
⁃ الوصف : مثل GPT-4 ، وتستخدم لمختلف المهام فهم اللغة الطبيعية.
⁃ Computer Vision:
⁃ الوصف : مثل أوبينكف لمهام معالجة الصور والفيديو.

9. الحوسبة المتطورة وإنترنت الأشياء (Internet of Things):

⁃ Edge Computing:
⁃ الوصف : التقنيات التي تجعل الحساب وتخزين البيانات أقرب إلى الموقع الذي تحتاج إليه.

⁃ IoT Platforms:
⁃ الوصف : مثل AWS تقنيات عمليات ، Azure تقنيات عمليات المحور ، وتقدم قدرات لإدارة وتأمين أجهزة تقنيات عمليات والبيانات.
نبذه قصيره
ماهو محرك Godot ؟
محرك Godot هو محرك تطوير ألعاب مفتوح المصدر يتيح للمطورين إنشاء ألعاب ثنائية وثلاثية الأبعاد. يتميز Godot بواجهة مرنة وسهلة الاستخدام، ويدعم العديد من اللغات البرمجية مثل GDScript (اللغة الخاصة بالمحرك)، وC#، وVisualScript. يوفر Godot مجموعة واسعة من الأدوات والميزات، بما في ذلك نظام مشاهد مرن، محرر مدمج، ودعماً للأجهزة المتعددة. يتميز أيضًا بالقدرة على تصدير الألعاب إلى منصات متعددة مثل Windows وmacOS وLinux وiOS وAndroid.
قبل أن لا ندخل في أقسام يجب معرفة ماهو مفهوم تقنية الـcallable وقابلية الاستدعاء في محرك Godot



مفهوم قابلية الاستدعاء-Callable في لغة GDScript وكيفية التعامل واستخدام الدوال بطرق متقدمة تُسهِّل عليك اختصار وتنظيم أكوادك بشكل سلس وتمنح منظورًا جديدًا في التعامل مع الدوال.

على سبيل المثال هل فكرت أن تخزن دالة معينة داخل متغير معين ؟
ثم تستخدم هذا المتغير لتمرره او ترسله لمكان آخر وتستدعي الدالة عن طريق هذا المتغير ؟
قد يكون الكلام غامضًا قليلًا لكن موضوعنا سيكون عن قابلية الاستدعاء وهو الذي يُساعد في هذه الأمور.


عناصر
ما هو الـ Callable
استدعاء الدالة من خلال الـ Callable
تمرير دالة داخل دالة أخرى
توضيح فكرة استخدام

- ما هو الـ Callable
قابلية الاستدعاء-Callable في لغة GDScript هو صنف مدمج (Built-in class) يمثل نوعًا خاصًا من البيانات، ويستخدم لتمثيل الدوال ككائنات. بمعنى أن قابلية الاستدعاء يمكن تمثيل الدوال و استدعائها واستخدامها بشكل مماثل لكيفية تعاملك مع البيانات والمتغيرات الأخرى في اللغة.

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

func sum(x, y):
    return x + y

var f: Callable = sum
# or var f = Callable(self, "sum")
لاحظ هنا قمت بتعريف دالة الجمع sum التي تقوم بجمع قيمتين وإرجاع الناتج، ومن ثم عرفت كائن f من نوع Callable وتم تعيينه ليكون مساويًا للدالة الجمع، بعد هذه الخطوة، أصبح بإمكانك استخدام الكائن f لاستدعاء الدالة الجمع.
قد تظن الآن أن f أصبحت دالة مماثلة لدالة الجمع وتستطيع أن تستدعيها هكذا f(1, 2) مثل ما تستدعي دالة الجمع هكذا sum(1, 2) بشكل مباشر.
var f : Callable = sum
var result = f(1, 2) # Error!!
print(result)
لكن في حقيقة الأمر، هذا ليس صحيحًا. تذكر أنني قلت أن f في الواقع تكون كائنًا من نوع الصنف “قابل الاستدعاء” وليست دالة بحد ذاتها، لذا لا يمكننا معاملتها كدالة بشكل مباشر، بل نعاملها ككائن يحتفظ أو مرتبط بالدالة.

وهذا هو سبب الخطأ الذي ظهر في الكود عند محاولة استخدام f بهذا الشكل f(1, 2).
لكن في حقيقة الأمر، هذا ليس صحيحًا. تذكر أنني قلت أن f في الواقع تكون كائنًا من نوع الصنف “قابل الاستدعاء” وليست دالة بحد ذاتها، لذا لا يمكننا معاملتها كدالة بشكل مباشر، بل نعاملها ككائن يحتفظ أو مرتبط بالدالة.

وهذا هو سبب الخطأ الذي ظهر في الكود عند محاولة استخدام f بهذا الشكل f(1, 2).

استدعاء الدالة من خلال الـ Callable
تذكر في مقالة الاصناف ومقالة الـ class_name قلت أن كل كائن يحتوي بداخله على دوال وخواص خاصة بالصنف بالتالي لو كان لديك كائن من نوع “قابل للاستدعاء” لنسميهobj وأسندت له دالة الجمع،الكائن obj لديه الآن بداخله خواص ودوال خاصة بالصنف “قابل للاستدعاء” من ضمن تلك الدوال دالة تدعى call أي استدعاء.

الآن لكي أقوم باستدعاء دالة الجمع المتواجدة داخل obj سأستخدم هذه الدالة call

var obj : Callable = sum
var result = obj.call(1, 2)
print(result) # 3
هنا عندما استدعي obj.call(1, 2) فكأنني استدعى sum(1, 2)

تمرير دالة داخل دالة أخرى
من خلال استخدام قابلية الاستدعاء، يُمكنك الآن تمرير الدوال داخل دوال أخرى واستدعائها بسهولة.

func receive(obj : Callable):
var result = obj.call(10, 5)
print(result)

receive(sum) # 15
ستلاحظ أن دالة الاستقبال receive التى أنشأناها تستقبل المعامل obj الذي هو كائن من نوع callable، ثم تستدعيه وتعطيه قيم 5 و 10.

الآن، باستخدام هذه الدالة يمكنك إرسال دالة الجمع دون استدعاؤها، بهذا الشكل receive(sum) أرسلت فقط الدالة. ما الذي تتوقعه أنت أن يحدث الآن ؟ أريدك أن تتبع الدالة وترى.

عند تمرير الدالة الجمع داخل الدالة الاستقبال سيتم تخزين الدالة الجمع في المعامل obj الذي هو من نوع “قابل الاستدعاء”.
الآن أصبح لدينا كائن يدعى obj كمعامل داخل دالة الاستقبال يمثل دالة الجمع. هذا يعني أنك تستطيع تمرير دالة داخل دالة أخرى تمامًا كما ترسل المتغيرات داخل الدوال الأخرى.

داخل دالة الاستقبال لكي تستدعي sum عن طريق الكائن obj استخدم obj.call() وهكذا سيتم استدعاء الدالة التي يمثلها الكائن obj. عند استدعائها، يتوجب عليك أيضًا تزويدها بالقيم التى تحتاجها دالة الجمع.

فكما هو ملاحظ أن obj.call() هنا تحتاج لقيمتين، وذلك لأن دالة الجمع كانت تستقبل قيمتين عند استدعائها، لذا أرسلنا لـ obj.call() القيمتين x و y هكذا obj.call(5, 10).
وبهذا الشكل، أمكنَك استخدام واستدعاء دالة الجمع من خلال obj.call()، ثم تم استقبال الناتج في متغير النتيجة result والذي هو ناتج جمع القيمتين 15، هكذا var result = obj.call(5, 10) وأخيرًا تم طباعة النتيجة باستخدام print(result).

لاحظ كيف بسهولة استطعت أن تمرر دالة داخل دالة بفضل قابلية الاستدعاء.

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

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

func sum(x, y):
return x + y
func applyOperation(x, y, obj: Callable):
var result = obj.call(x, y)
return result
هنا توجد دالة applyOperation(x, y, obj) التي تستقبل القيم x ,y التي ستُرسل للمعامل obj الذي سيستدعى call ويرسل تلك القيم ثم ترجع الناتج ببساطة.

المثال بسيط لكن كيف ستستفيد من هذا ؟

var result = applyOperation(5, 10, sum)
print(result) # return 15
لاحظ انني ارسلت sum لدالة تنفيذ الإجراء-applyOperation ليستقبلها المعامل obj الذي يمثل كائن من صنف “قابل للاستدعاء” كما تعرف.
ثم داخل دالة applyOperation ستجد var result = obj.call(x, y) الكائن obj الآن يمثل دالة الجمع التي أرسلتها ودالة الجمع كانت تستقبل قيمتين لذا obj.call أصبحت كذلك.

هنا الكائن obj كما فهمت سيمثل كائن يحتفظ بالدالة الأصلية التي أُسندت لها وهي دالة الجمع sum،
و يجب أن تدرك أن الكائن obj يمثل أي دالة ترسلها، فالأمر لا يختصر على الجمع.

بمعنى أنني أستطيع الآن استخدام أكثر من دالة كـ “قابل للاستدعاء”، كيف ذلك ؟ ركز معي هنا جيدًا.
لنفترض أن لدينا دوالًا إضافية بجانب دالة الجمع.

func sum(x, y):
return x + y
func sub(x, y):
return x - y
func mul(x, y):
return x * y
func div(x, y):
return x / y
هنا لدي مجموعة من الدوال، والآن يمكنني أن أستخدم أي منها كـ قابلية استدعاء دالة تنفيذ الإجراء.

func applyOperation(x, y, obj):
var result = obj.call(x, y) # استدعاء الدالة التي مررتها
return result

# يمكنك الآن استدعاء دالة تنفيذ الإجراء مع تمرير دوال قابلية الاستدعاء متنوعة :
applyOperation(5, 10, sum); # 15
applyOperation(5, 10, sub); # -5
applyOperation(5, 10, mul); # 50
applyOperation(5, 10, div); # 0.5
هنا أُرسل دوالًا مختلفة قابلة للاستدعاء داخل دالة تنفيذ الأجراء في كل مرة.

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

1. Project Gutenberg: يحتوي على آلاف الكتب الأدبية المجانية.
- [projectgutenberg.org](https://www.gutenberg.org)

2. Open Library: يوفر مجموعة كبيرة من الكتب التي يمكنك قراءتها أو تحميلها.
- [openlibrary.org](https://openlibrary.org)

3. Google Books: يمكنك البحث عن كتب مجانية في مكتبتهم.
- [books.google.com](https://books.google.com)

4. LibriVox: يقدم كتب صوتية مجانية من كتب عامة.
- [librivox.org](https://librivox.org)

5. Internet Archive: مكتبة تضم مجموعة متنوعة من الكتب والأفلام والموسيقى المجانية.
- [archive.org](https://archive.org)

6. ManyBooks: يحتوي على مجموعة واسعة من الكتب التي يمكنك تحميلها مجانًا.
- [manybooks.net](https://manybooks.net)

يمكنك زيارة هذه المواقع والبحث عن الكتب التي تهمك.
👍1
يا رب تتبدل الأحوال وتتغير الناس وتبقى أنت وحدك الحي القيوم الذي لا يتبدل ولا يتغير.. اللهم اجعل وجهتنا لك ورؤيتنا لك وسعينا إليك
‏يا عبدي لو علمت كيف أدبر لك أمورك، لعلمت يقينًا أني أرحم بك من أمك وأبيك، ولذاب قلبكَ محبًة لي، فقُل الحمدلله..