البرمجة بلغة OCaml: صحيحة وفعّالة وجميلة › تصدير 1 / 11 التالي

تصدير

عن هذا الكتاب

الإبلاغ عن الأخطاء. إذا وجدت خطأً، فيرجى الإبلاغ عنه! أو إذا كانت لديك اقتراح حول كيفية إعادة كتابة جزء من الكتاب، فأخبرنا بذلك. ما عليك سوى الانتقال إلى صفحة الكتاب التي تريد تقديم اقتراح بشأنها، والنقر على أيقونة GitHub (التي تبدو كقطة) قرب أعلى يمين الصفحة، ثم النقر على «فتح مسألة» (open issue) أو «اقتراح تعديل» (suggest edit). الخيار الأخير أثقل قليلًا، لأنه يتطلب منك تفرّع مستودع الكتاب (fork) على GitHub. لكن بالنسبة للتعديلات الطفيفة فسيُقدَّر ذلك وسيؤدي إلى تبنّي الاقتراحات بسرعة أكبر.

الخلفية. يُستخدم هذا الكتاب في جامعة كورنيل في مقرر برمجة للفصل الدراسي الثالث. درس معظم الطلاب فصلًا دراسيًا من البرمجة التمهيدية بلغة Python، يليه فصل دراسي من البرمجة كائنية التوجه بلغة Java. لذلك تُعقد مقارنات متكررة مع هاتين اللغتين. ولا ينبغي أن يجد القراء الذين درسوا لغات مشابهة أي صعوبة في المتابعة. لا يفترض الكتاب أي معرفة مسبقة بالبرمجة الوظيفية (functional programming)، لكنه يفترض أن لدى القراء خبرة سابقة في البرمجة بإحدى اللغات الأمرية (imperative language) السائدة. كما يُفترض الإلمام بالرياضيات المتقطعة (discrete mathematics) بمستوى مقرر علوم الحاسوب الاعتيادي في الفصل الأول.

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

تستخدم الفيديوهات في الغالب إصدارات OCaml ومنظومتها التي كانت سائدة في خريف 2020. من المرجح أن تختلف الإصدارات الحالية التي تستخدمها عمّا في الفيديوهات، لكن لا تقلق: الأفكار الأساسية هي نفسها. الفرق الأكثر وضوحًا هو على الأرجح إضافة VS Code الخاصة بلغة OCaml. في خريف 2020 كان لا يزال يُستخدم إضافة «OCaml and Reason IDE» المتقادمة. وقد حلّت محلها منذ ذلك الحين إضافة «OCaml Platform».

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

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

شيفرة قابلة للتنفيذ. تحتوي صفحات كثيرة من هذا الكتاب على شيفرة OCaml مضمّنة فيها. ويظهر ناتج تلك الشيفرة بالفعل في الكتاب. إليك مثالًا:

print_endline "Hello world!"
Hello world!
- : unit = ()

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

  • Binder سيطلق موقع mybinder.org، وهو خدمة سحابية مجانية توفر «بيئات قابلة لإعادة الإنتاج، وتفاعلية، وقابلة للمشاركة للعلوم على نطاق واسع». تجري جميع العمليات الحسابية على خوادمهم السحابية، لكن واجهة المستخدم تُقدَّم عبر متصفحك. سيستغرق فتح صفحة الكتاب في Binder بعض الوقت. وبمجرد أن يفتح، يمكنك تعديل الشيفرة وتشغيلها في دفتر Jupyter (Jupyter notebook). دفاتر Jupyter هي مستندات (تنتهي عادةً بامتداد .ipynb) يمكن عرضها في متصفحات الويب واستخدامها لكتابة محتوى سردي إلى جانب الشيفرة. أصبحت شائعة في مجتمعات علم البيانات (خصوصًا Python وR وJulia) كطريقة لمشاركة التحليلات. والآن يمكن تشغيل لغات كثيرة في دفاتر Jupyter، ومنها OCaml. تُكتب الشيفرة والنصوص في خلايا (cells) داخل دفتر Jupyter. انظر إلى قائمة «Cell» فيه للعثور على أوامر تشغيل الخلايا. لاحظ أن Shift-Enter هو عادةً مفتاح اختصار لتشغيل الخلية التي يكون عليها التركيز.
  • Live Code سيفعل الشيء نفسه تقريبًا، إلا أنه بدلًا من مغادرة صفحة الكتاب الحالية وأخذك إلى Binder، سيعدّل خلايا الشيفرة في الصفحة لتصبح قابلة للتحرير. يستغرق إنشاء الاتصال في الخلفية بعض الوقت، وأثناء ذلك سترى «Waiting for kernel». بعد إنشاء الاتصال، يمكنك تعديل جميع خلايا الشيفرة في الصفحة وإعادة تشغيلها. إذا فشل الاتصال، فشغّل موقع Binder أولًا؛ فقد يستغرق ذلك وقتًا طويلًا. بعد نجاحه وتحميل صفحة الكتاب كدفتر Jupyter، يمكنك إغلاق Binder وإعادة تحميل صفحة الكتاب وتشغيل Live Code مجددًا. ومن المتوقع أن ينجح الآن في الاتصال بسرعة نسبيًا.

جرّب الآن التفاعل مع الخلية أعلاه لجعلها تطبع سلسلة نصية من اختيارك. ماذا عن: "Camels are bae."

ملاحظة

عندما تكتب شيفرة OCaml «حقيقية»، لن تكون هذه هي الواجهة التي ستستخدمها. ستكتب الشيفرة في محرر مثل Visual Studio Code أو Emacs، وستصرّفها من الطرفية. إن Binder وLive Code مخصصان فقط للتفاعل السلس مع الكتاب.

صفحات قابلة للتنزيل. يمكن تنزيل كل صفحة من هذا الكتاب بتنسيقات متنوعة. توجد أيقونة التنزيل أعلى يمين كل صفحة. ستجد دائمًا الشيفرة المصدرية الأصلية للصفحة، وهي عادةً Markdown — أو بشكل أدق MyST Markdown، وهو امتداد لـ Markdown للكتابة التقنية. كما تتوفر كل صفحة على حدة بصيغة PDF، وهي مجرد طباعة من متصفحك. للحصول على الكتاب كاملًا بصيغة PDF، راجع الفقرة الخاصة بذلك أدناه.

يمكن أيضًا تنزيل الصفحات التي تحتوي على خلايا شيفرة OCaml كدفاتر Jupyter. لتشغيلها محليًا على جهازك (بدلًا من السحابة على Binder)، ستحتاج إلى تثبيت Jupyter. أسهل طريقة لفعل ذلك هي عادةً تثبيت Anaconda. ثم ستحتاج إلى تثبيت OCaml Jupyter، وهو يتطلب أن تكون OCaml مثبتة لديك مسبقًا. للتوضيح، لا حاجة إلى تثبيت Jupyter أو استخدام الدفاتر. إنها مجرد طريقة أخرى للتفاعل مع هذا الكتاب إلى جانب قراءته.

التمارين والحلول. في نهاية كل فصل باستثناء الأول، ستجد قسمًا من التمارين. وتُوسم التمارين بتقييم للصعوبة:

  • نجمة واحدة [★]: تمارين سهلة لا تستغرق سوى دقيقة أو دقيقتين.
  • نجمتان [★★]: تمارين مباشرة تستغرق بضع دقائق.
  • ثلاث نجوم [★★★]: تمارين قد تستغرق ما بين خمس إلى عشرين دقيقة تقريبًا.
  • أربع نجوم [★★★★] أو أكثر: تمارين تتسم بالتحدي أو تستهلك وقتًا، مقدَّمة للطلاب الذين يرغبون في التعمق أكثر في المادة.

من الممكن أننا أخطأنا في تقدير صعوبة إحدى المسائل من وقت لآخر. أخبرنا إذا كنت ترى أن التقييم غير دقيق.

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

PDF. يتوفر إصدار PDF كامل من هذا الكتاب. وهو لا يحتوي على الفيديوهات المضمّنة أو التعليقات أو الميزات الأخرى التي يتمتع بها إصدار HTML. وقد يحتوي أيضًا على أخطاء في التنضيد. في الوقت الحالي، لا يتوفر إصدار للأجهزة اللوحية (ePub، إلخ)، لكن معظم الأجهزة اللوحية تتيح لك استيراد ملفات PDF.

تثبيت OCaml

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

إذا أردت أن تخطو خطوة أبعد لكنك لست مستعدًا لقضاء وقت في تثبيت OCaml بنفسك، فنحن نوفر آلة افتراضية مثبّتة فيها OCaml مسبقًا داخل نظام تشغيل Linux.

لكن إذا أردت تطوير برامج OCaml بنفسك، فستحتاج إلى تثبيته على جهازك. لا توجد طريقة «صحيحة» متفق عليها عالميًا لفعل ذلك. والتعليمات أدناه مخصصة لمقرر CS 3110 في جامعة كورنيل، الذي له أهداف واحتياجات تتجاوز مجرد OCaml. ومع ذلك، قد تجدها مفيدة حتى إن لم تكن طالبًا في المقرر.

إليك ما سنثبته:

  • بيئة تطوير Unix
  • OPAM، مدير حزم OCaml
  • تبديل (switch) OPAM يتضمن مصرّف OCaml وبعض الحزم
  • محرر Visual Studio Code مع دعم OCaml

ستعتمد عملية التثبيت كثيرًا على الطرفية (terminal)، أو الواجهة النصية لحاسوبك. إذا لم تكن على دراية كافية بها، فقد ترغب في تحسين مهاراتك عبر دليل تعليمي للطرفية.

ملاحظة

إذا كانت هذه أول مرة تثبّت فيها برمجيات تطوير، فمن الجدير بالذكر أن «الاقتراب لا يكفي»: فمحاولة تجاوز خطأ ما تؤدي عادةً إلى أخطاء أسوأ، وإلى الحزن. ذلك لأننا نثبّت نوعًا من برج من البرمجيات، حيث يبني كل مستوى في البرج على المستوى السابق. وإذا لم تكن تبني على أساس متين، فقد ينهار البناء كله. والخبر السار أنه إذا واجهت خطأً، فأنت على الأرجح لست وحدك. فغالبًا ما يكشف بحث سريع على Google عن حلول اكتشفها آخرون. وبالطبع، فكّر نقديًا في الاقتراحات التي يقدمها غرباء عشوائيون على الإنترنت.

لنبدأ!

بيئة تطوير Unix

مهم

أولًا، حدّث نظام تشغيلك. إذا كنت تنوي إجراء أي ترقيات كبيرة لنظام التشغيل، فافعلها الآن. وإلا فعندما تجد الوقت للترقية لاحقًا، قد تضطر إلى إعادة بعض عملية التثبيت هذه أو كلها. من الأفضل إنجاز ذلك مسبقًا.

Linux

إذا كنت تستخدم Linux بالفعل، فقد انتهيت من هذه الخطوة. تابع إلى تثبيت OPAM أدناه.

Mac

في جوهره، macOS هو بالفعل نظام تشغيل قائم على Unix. لكنك ستحتاج إلى بعض أدوات المطورين ومدير حزم Unix. وهناك خياران للاختيار بينهما: Homebrew وMacPorts. من منظور هذا الكتاب ومقرر CS 3110، لا يهم أيهما تختار:

  • إذا كنت معتادًا بالفعل على أحدهما، فلا بأس في الاستمرار في استخدامه. تأكد من تشغيل أمر التحديث الخاص به قبل متابعة هذه التعليمات.
  • وإلا فاختر أحدهما واتبع تعليمات التثبيت على موقعه. عادةً ما تكون عملية التثبيت لـ Homebrew أسهل وأسرع، وقد يدفعك ذلك نحو اختياره. إذا اخترت MacPorts، فتأكد من اتباع جميع التعليمات التفصيلية في صفحته، بما فيها XCode وخادم X11. لا تثبّت كلا من Homebrew وMacPorts؛ فهما ليسا مصممين للتعايش. إذا غيّرت رأيك لاحقًا، فتأكد من إلغاء تثبيت أحدهما قبل تثبيت الآخر.

بعد الانتهاء من تثبيت/تحديث Homebrew أو MacPorts، تابع إلى تثبيت OPAM أدناه.

Windows

أصبح تطوير Unix في Windows ممكنًا بفضل نظام Windows الفرعي لـ Linux (WSL). إذا كان لديك إصدار حديث من Windows (بناء 20262، الصادر في نوفمبر 2020، أو أحدث)، فمن السهل تثبيت WSL. وإذا لم يكن لديك إصدار بهذا الحداثة، فجرّب تشغيل Windows Update للحصول عليه.

ملاحظة

إذا ظهرت لك رسالة خطأ بشأن «الآلة الافتراضية» أثناء تثبيت WSL، فقد تحتاج إلى تمكين المحاكاة الافتراضية (virtualization) في BIOS جهازك. تعتمد تعليمات ذلك على الشركة المصنّعة لجهازك. جرّب البحث على Google عن العبارة «enable virtualization [manufacturer] [model]»، مع استبدال [manufacturer] و[model] بالشركة المصنّعة وطراز جهازك. قد تساعدك أيضًا صفحة Red Hat Linux هذه.

مع إصدار حديث من Windows، وبافتراض أنك لم تثبّت WSL من قبل، إليك كل ما عليك فعله:

  • افتح Windows PowerShell كمسؤول. لفعل ذلك، انقر على Start، واكتب PowerShell، وسيظهر لك كأفضل تطابق. انقر على «Run as Administrator»، ثم انقر على Yes للسماح بالتغييرات.
  • نفّذ wsl --install. (أو إذا كنت قد ثبّت WSL بالفعل لكن ليس Ubuntu من قبل، فبدلًا من ذلك نفّذ wsl --install -d Ubuntu.) عند اكتمال تنزيل Ubuntu، سيطلب منك على الأرجح إعادة التشغيل. افعل ذلك. ستستأنف عملية التثبيت تلقائيًا بعد إعادة التشغيل.
  • سيُطلب منك إنشاء اسم مستخدم وكلمة مرور لـ Unix. يمكنك استخدام أي اسم مستخدم وكلمة مرور تريدهما. لا علاقة لهما باسم مستخدم Windows وكلمة مروره (وإن كان لك أن تعيد استخدامهما). لا تضع مسافة في اسم المستخدم. لا تنسَ كلمة المرور. ستحتاج إليها في المستقبل.

تحذير

لا تتابع هذه التعليمات إذا لم يُطلب منك إنشاء اسم مستخدم وكلمة مرور لـ Unix. فقد حدث خطأ ما. ربما لم يكتمل تثبيت Ubuntu بشكل صحيح. جرّب إلغاء تثبيت Ubuntu وإعادة تثبيته عبر قائمة Start في Windows.

الآن انتقل إلى فقرة «إعداد Ubuntu» أدناه.

بدون إصدار حديث من Windows، ستحتاج إلى اتباع تعليمات التثبيت اليدوي من Microsoft. تفضّل OCaml الإصدار WSL2 على WSL1 (ويوفر WSL2 تحسينات في الأداء والوظائف)، لذا ثبّت WSL2 إن أمكن.

إعداد Ubuntu. تفترض بقية هذه التعليمات أنك ثبّت Ubuntu (22.04) بوصفه توزيعة Linux. فهو التوزيعة الافتراضية في WSL. من حيث المبدأ، ينبغي أن تعمل توزيعات أخرى، لكنها قد تتطلب أوامر مختلفة من هذه النقطة فصاعدًا.

افتح تطبيق Ubuntu. (قد يكون مفتوحًا بالفعل إذا كنت قد انتهيت للتو من تثبيت WSL.) ستكون عند موجه Bash (Bash prompt)، الذي يبدو على نحو ما هكذا:

user@machine:~$

تحذير

إذا كان الموجه بدلًا من ذلك يبدو مثل root@...#، فهناك خطب ما. هل أنشأت اسم مستخدم وكلمة مرور لـ Unix خاصين بـ Ubuntu في الخطوة السابقة أعلاه؟ إذا كان الأمر كذلك، فينبغي أن يكون اسم المستخدم في هذا الموجه هو اسم المستخدم الذي اخترته حينها، لا root. لا تتابع هذه التعليمات إذا كان موجهك يبدو مثل root@...#. ربما يمكنك إلغاء تثبيت Ubuntu وإعادة تثبيته.

في الإصدار الحالي من طرفية Windows، ينسخ Ctrl+Shift+C ويلصق Ctrl+Shift+V في الطرفية. لاحظ أنه يجب عليك تضمين Shift ضمن ضغطة المفاتيح هذه. في الإصدارات الأقدم من الطرفية، قد تحتاج إلى إيجاد خيار في إعدادات الطرفية لتمكين اختصارات لوحة المفاتيح تلك.

نفّذ الأمر التالي لتحديث مدير الحزم APT، وهو ما يساعد على تثبيت حزم Unix:

sudo apt update

سيُطلب منك كلمة مرور Unix التي اخترتها. تعني البادئة sudo تنفيذ الأمر باعتبارك المسؤول، أي «المستخدم الخارق» (super user). بعبارة أخرى، نفّذ هذا الأمر كمستخدم خارق، ومن هنا جاءت التسمية «sudo».

تحذير

تنفيذ الأوامر باستخدام sudo قد يكون خطيرًا ولا ينبغي الإقدام عليه باستخفاف. لا تعتد وضع sudo أمام الأوامر، ولا تجرّبه عشوائيًا دون سبب.

نفّذ الآن هذا الأمر لترقية جميع حزم برمجيات APT:

sudo apt upgrade -y

ثم ثبّت بعض الحزم المفيدة التي سنحتاجها:

sudo apt install -y zip unzip build-essential

أنظمة الملفات. لـ WSL نظام ملفات خاص به يختلف عن نظام ملفات Windows، وإن كانت هناك طرق للوصول من كل منهما إلى الآخر.

  • عند تشغيلك Ubuntu وظهور موجه $، تكون داخل نظام ملفات WSL. ويُسمى دليلك الرئيسي هناك ~، وهو اسم مستعار مدمج يشير إلى /home/your_ubuntu_user_name. يمكنك تنفيذ explorer.exe . (لاحظ النقطة في النهاية) لفتح دليلك الرئيسي في Ubuntu داخل مستكشف Windows.
  • من Ubuntu، يمكنك الوصول إلى دليلك الرئيسي في Windows عبر المسار /mnt/c/Users/your_windows_user_name/.
  • من مستكشف Windows، يمكنك الوصول إلى دليلك الرئيسي في Ubuntu تحت أيقونة Linux في القائمة اليسرى (قرب «This PC» و«Network»)، ثم التنقل إلى Ubuntu ← home ← your_ubuntu_user_name. أو يمكنك الانتقال مباشرةً بكتابة العبارة التالية في شريط مسار مستكشف Windows: \\wsl$\Ubuntu\home\your_ubuntu_user_name.

تدرّب الآن على الوصول إلى دليلك الرئيسي في Ubuntu ودليلك الرئيسي في Windows، وتأكد من قدرتك على تمييز الدليل الذي أنت فيه. لمزيد من المعلومات المتقدمة، راجع دليل Microsoft لأنظمة ملفات Windows وLinux.

نوصي بتخزين أعمال تطوير OCaml في دليلك الرئيسي في Ubuntu، لا في دليلك الرئيسي في Windows. وضمنيًا، توصي Microsoft بذلك أيضًا في الدليل المشار إليه للتو.

تثبيت OPAM

Mac. إذا كنت تستخدم Homebrew، فنفّذ هذا الأمر:

brew install opam

إذا كنت تستخدم MacPorts، فنفّذ هذا الأمر:

sudo port install opam

Windows. نفّذ هذا الأمر من Ubuntu:

sudo apt install opam

Linux. اتبع التعليمات الخاصة بتوزيعتك.

تهيئة OPAM

تحذير

لا تضع sudo أمام أي أمر من أوامر opam. فذلك سيفسد تثبيت OCaml لديك.

Linux وMac وWSL2. نفّذ:

opam init --bare -a -y

لا تقلق إذا ظهرت لك ملاحظة بشأن التأكد من أن .profile «مصدره جيد» في .bashrc. لا حاجة إلى فعل أي شيء بشأن ذلك.

إذا ظهرت لك تحذير بأن OPAM قديم، فحدّثه بتنفيذ:

opam update

WSL1. نأمل أنك تستخدم WSL2 لا WSL1. لكن على WSL1، نفّذ:

opam init --bare -a -y --disable-sandboxing

من الضروري تعطيل العزل الرملي (sandboxing) بسبب مشكلة تتعلق بـ OPAM وWSL1.

إنشاء تبديل OPAM

التبديل (switch) هو تثبيت مسمّى لـ OCaml بإصدار معيّن من المصرّف ومجموعة معيّنة من الحزم. يمكنك امتلاك العديد من التبديلات، وحسنًا، التبديل بينها — ومن هنا جاءت التسمية. أنشئ تبديلًا لمقرر CS 3110 لهذا الفصل الدراسي بتنفيذ هذا الأمر:

opam switch create cs3110-2026fa ocaml-base-compiler.5.3.0

ملاحظة

إذا فشل ذلك الأمر برسالة تفيد بأن المصرّف 5.3.0 غير موجود، فمن المرجح أنك ثبّت OPAM في وقت ما في الماضي وتحتاج الآن إلى تحديثه. افعل ذلك باستخدام opam update.

قد يُطلب منك تنفيذ الأمر التالي. ولن يهم إن نفّذته أم لا، بسبب الخطوة التالية مباشرةً التي سنقوم بها (أي تسجيل الخروج).

eval $(opam env)

الآن نحتاج إلى التأكد من أن بيئة OCaml لديك قد ضُبطت بشكل صحيح. سجّل الخروج من نظام التشغيل (أو أعد التشغيل فقط). ثم أعد فتح الطرفية ونفّذ هذا الأمر:

opam switch list

ينبغي أن تحصل على ناتج مثل هذا:

#  switch         compiler
→  cs3110-2026fa  ocaml-base-compiler.5.3.0,ocaml-options-vanilla.1

قد تكون هناك أسطر أخرى إذا كنت قد عملت على تطوير OCaml من قبل. وسيكون هناك عمود آخر باسم «description» لا يُعرض محتواه هنا. تحقق جيدًا من الآتي:

  • يجب ألا يظهر لك تحذير يقول «The environment is not in sync with the current switch. You should run eval $(opam env)». وإذا حدثت أيضًا أي من المشكلتين أدناه، فستحتاج إلى حل هذه المشكلة أولًا.
  • يجب أن يكون هناك سهم أيمن في العمود الأول بجانب تبديل الفصل الدراسي الحالي.
  • ويجب أن يكون لهذا التبديل الاسم الصحيح وإصدار المصرّف الصحيح.

تحذير

إذا ظهر لك ذلك التحذير بشأن opam env، فهناك خطب ما. من المرجح أن صدفة الأوامر (shell) لديك لا تنفّذ أوامر تهيئة OPAM التي كان من المفترض أن يثبّتها opam init. يمكنك تجربة opam init --reinit لترى إن كان ذلك يصلح المشكلة. وتأكد أيضًا من أنك سجّلت الخروج من نظام التشغيل فعلًا (أو أعدت التشغيل).

تابع بتثبيت حزم OPAM التي نحتاجها:

opam install -y utop odoc ounit2 qcheck bisect_ppx menhir ocaml-lsp-server ocamlformat

تأكد من نسخ السطر السابق كاملًا. ستحصل على بعض الناتج عن تهيئة المحرر. وما لم تكن تنوي استخدام Emacs أو Vim لتطوير OCaml، يمكنك تجاهل ذلك الناتج بأمان. سنستخدم VS Code كمحرر في هذه التعليمات، لذا لنتجاهله.

ينبغي أن تكون الآن قادرًا على تشغيل utop، الواجهة التفاعلية الشاملة (Universal Toplevel) لـ OCaml.

utop

ملاحظة

ينبغي أن ترى رسالة «Welcome to utop version … (using OCaml version 5.3.0)!». وإذا كان إصدار OCaml غير صحيح، فمن المرجح أن لديك مشكلة في البيئة. راجع الملاحظة أعلاه بشأن الأمر opam env.

أدخل 3110 متبوعًا بفاصلة منقوطة مزدوجة. اضغط Enter. رمز # هو موجه utop؛ ولا تكتبه بنفسك.

# 3110;;
- : int = 3110

توقّف قليلًا لتقدّر جمال 3110. ثم اخرج من utop. لاحظ أنك هذه المرة يجب أن تدخل علامة # الإضافية قبل توجيه الخروج.

# #quit;;

طريقة أسرع للخروج هي كتابة Control+D.

التحقق المزدوج من OCaml

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

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

ثانيًا، شغّل utop وتأكد من أنه يعمل. وإذا لم يعمل، فإليك بعض المشكلات الشائعة:

  • هل أنت عند موجه Unix الصحيح؟ على Mac، تأكد من أنك في صدفة Unix الافتراضية لطرفيتك: لا تشغّل bash أو zsh أو أي شيء آخر يدويًا لتغيير الصدفة. على Windows، تأكد من أنك في تطبيق Ubuntu، لا في PowerShell أو Cmd.
  • هل بيئة OPAM مضبوطة؟ إذا لم يكن utop أمرًا معروفًا، فنفّذ eval $(opam env) ثم حاول تشغيل utop مرة أخرى. فإذا عمل utop الآن، فمعنى ذلك أن صدفة تسجيل الدخول لديك لا تنفّذ بطريقة ما الأوامر الصحيحة لتنشيط بيئة OPAM تلقائيًا؛ ولا ينبغي أن تضطر إلى تنشيط البيئة يدويًا بالأمر eval. من المرجح أن شيئًا ما حدث خطأ عند تنفيذك الأمر opam init. لإصلاح ذلك، اتبع تعليمات «الإعادة» أدناه.
  • هل تبديلك مدرج؟ نفّذ opam switch list وتأكد من إدراج تبديل باسم cs3110-2026fa، وأنه يحتوي على المصرّف 5.3.0، وأنه التبديل النشط (ويُشار إليه بسهم بجانبه). إذا كان ذلك التبديل موجودًا لكنه غير نشط، فنفّذ opam switch cs3110-2026fa ثم انظر إن كان utop يعمل. وإذا لم يكن ذلك التبديل موجودًا، فاتبع تعليمات «الإعادة» أدناه.

تعليمات الإعادة: أزل دليل OPAM بتنفيذ rm -r ~/.opam. ثم ارجع إلى خطوة تهيئة OPAM في التعليمات أعلاه، وتابع إلى الأمام. وكن شديد الحرص على استخدام أوامر OPAM نفسها الواردة أعلاه؛ إذ تحدث الأخطاء أحيانًا عند حذف أجزاء منها. وأخيرًا، تحقق مرة أخرى: أعد التشغيل وانظر إن كان utop لا يزال يعمل.

مهم

إنك تريد الوصول إلى حالة يعمل فيها utop فورًا بعد إعادة التشغيل، دون الحاجة إلى كتابة أي أوامر إضافية.

Visual Studio Code

يُعدّ Visual Studio Code خيارًا رائعًا كمحرر شيفرة لـ OCaml. (وإن كنت مستخدمًا متقدمًا لـ Emacs أو Vim، فهما رائعان أيضًا.)

أولًا، نزّل وثبّت Visual Studio Code (ويُشار إليه من الآن فصاعدًا بـ VS Code) وفق تعليمات Microsoft لنظام تشغيلك: تعليمات Mac، تعليمات Windows، تعليمات Linux.

تحذير

على Mac يجب عليك اتباع تعليمات Microsoft لتثبيت VS Code في مجلد Applications. فتجاهل تلك التعليمات سيؤدي إلى مشكلات لا تظهر إلا لاحقًا. تأكد من إتمام الأمر بشكل صحيح الآن.

شغّل VS Code. افتح لوحة الإضافات، إما بالانتقال إلى View → Extensions، أو بالنقر على أيقونتها في عمود الأيقونات على اليسار — وهي تبدو كأربعة مربعات صغيرة، المربع العلوي الأيمن منها منفصل عن الثلاثة الأخرى.

في مواضع متعددة من التعليمات التالية سيُطلب منك «فتح لوحة الأوامر» (Command Palette). لفعل ذلك، انتقل إلى View → Command Palette. وهناك أيضًا اختصار لوحة مفاتيح خاص بنظام التشغيل، ستراه على يمين عبارة «Command Palette» في قائمة View تلك.

ثانيًا، اتبع إحدى هذه الخطوات إذا كنت على Windows أو Mac:

  • على Windows فقط: ثبّت إضافة «WSL».
  • على Mac فقط: افتح لوحة الأوامر واكتب «shell command» للعثور على الأمر «Shell Command: Install ‘code’ command in PATH». ثم نفّذه.

ثالثًا، بغض النظر عن نظام تشغيلك، أغلق أي طرفيات مفتوحة — أو سجّل الخروج أو أعد التشغيل فقط — لتأخذ إعدادات المسار الجديدة مفعولها، حتى تتمكن لاحقًا من تشغيل VS Code من الطرفية.

رابعًا، على Windows فقط، افتح لوحة الأوامر ونفّذ الأمر «WSL: Connect to WSL». (وإذا كنت على Mac، فتخطَّ إلى الخطوة التالية.) في المرة الأولى التي تفعل فيها ذلك، ستُثبَّت بعض البرمجيات الإضافية. بعد اكتمال ذلك، سترى مؤشر «WSL: Ubuntu» في أسفل يسار نافذة VS Code. تأكد من رؤيتك «WSL: Ubuntu» هناك قبل متابعة الخطوة التالية أدناه. وإذا رأيت مجرد أيقونة تشبه >< فانقر عليها، واختر «Connect to WSL» من لوحة الأوامر التي تُفتح.

خامسًا، افتح مرة أخرى لوحة إضافات VS Code. ابحث عن إضافة «OCaml Platform» من OCaml Labs وثبّتها. وكن حريصًا على تثبيت الإضافة بهذا الاسم بالضبط.

تحذير

الإضافات المسماة ببساطة «OCaml» أو «OCaml and Reason IDE» ليست هي الصحيحة. فكلتاهما قديمة ولم يعد مطوروها يصونونها.

التحقق المزدوج من VS Code

لنتأكد من أن دعم OCaml في VS Code يعمل.

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

افتح صدفة Unix جديدة تمامًا. Windows: تذكّر أنها Ubuntu، لا PowerShell أو Cmd. Mac: تذكّر أنه لا ينبغي أن تنتقل يدويًا إلى صدفة مختلفة بكتابة zsh أو bash.

انتقل إلى دليل من اختيارك، ويفضل أن يكون دليلًا فرعيًا من دليلك الرئيسي. على سبيل المثال، يمكنك إنشاء دليل لأعمال مقرر 3110 داخل دليلك الرئيسي:

mkdir ~/3110
cd ~/3110

في ذلك الدليل افتح VS Code بتنفيذ:

code .

انتقل إلى File → New File. واحفظ الملف باسم test.ml. وينبغي أن يمنحه VS Code أيقونة جمل برتقالية اللون.

اكتب شيفرة OCaml التالية ثم اضغط Return/Enter:

let x : int = 3110

أثناء كتابتك، ينبغي أن يلوّن VS Code الصياغة، ويقترح بعض الإكمالات، ويضيف تعليقًا صغيرًا فوق سطر الشيفرة. جرّب تغيير int التي كتبتها إلى string. ينبغي أن يظهر خط متعرج تحت 3110. مرّر مؤشر الفأرة فوقه لترى رسالة الخطأ. وانتقل إلى View → Problems لتراه هناك أيضًا. أضف علامتي اقتباس مزدوجتين حول العدد الصحيح ليصبح سلسلة نصية، فتختفي المشكلة.

إذا لم تلاحظ تلك السلوكيات، فهناك خطب ما في تثبيتك. وإليك كيفية المتابعة:

  • تأكد من أنك، من موجه Unix نفسه الذي شغّلت منه VS Code، تستطيع إكمال تعليمات التحقق المزدوج الخاصة بتبديل OPAM لديك بنجاح: هل يمكنك تشغيل utop؟ هل التبديل الصحيح نشط؟ وإلا، فتلك هي المشكلة التي تحتاج إلى حلها أولًا. ثم عد إلى مشكلة VS Code. فربما تكون قد حُلّت الآن.
  • تأكد من أنك تستخدم أحدث إصدار من VS Code. نفّذ أمر لوحة أوامر VS Code «Code: Check for Updates». وإذا لم تستطع تحديث VS Code وكنت على Mac، فتأكد من أنك اتبعت تعليمات Microsoft لتثبيت VS Code في مجلد Applications.
  • إذا كنت على WSL وأضاف VS Code تلوين الصياغة لكنه لم يضف الخطوط المتعرجة كما وُصف أعلاه، و/أو ظهرت لك رسالة خطأ «Sandbox initialization failed»، فتحقق مرة أخرى من رؤيتك مؤشر «WSL» في أسفل يسار نافذة VS Code. فإن رأيته، فتأكد من تثبيت إضافة «OCaml Platform». وإن لم تره، فتأكد من أنك ثبّت إضافة «WSL» كما وُصف أعلاه، ومن أنك تشغّل VS Code من Ubuntu لا من PowerShell أو من واجهة Windows الرسومية.

إذا ظللت عالقًا في مشكلة ما، فجرّب إلغاء تثبيت VS Code، وإعادة التشغيل، وإعادة تنفيذ جميع تعليمات التثبيت أعلاه من الصفر. وانتبه جيدًا لأي تحذيرات أو أخطاء.

تحذير

أثناء استكشاف أي مشكلات في VS Code، لا تكتب أي مسارات كتابةً صريحة في ملف إعدادات VS Code، بغض النظر عن أي نصائح قد تجدها على الإنترنت. فتلك مسكّن مؤقت، لا علاج للمشكلة الجوهرية الحقيقية. والأرجح بكثير أن المشكلة الحقيقية تتعلق ببيئة OCaml، ويمكنك التحقيق فيها باستخدام تعليمات التحقق المزدوج من OCaml أعلاه.

إعدادات VS Code

نوصي بتعديل بعض إعدادات المحرر. افتح ملف إعدادات المستخدم بصيغة JSON عبر (i) الانتقال إلى View → Command Palette، و(ii) كتابة «user settings json»، و(iii) اختيار Open User Settings (JSON). سترى ملف JSON قد يحتوي بالفعل على بعض الإعدادات. وإذا كان كذلك، فسيبدو هكذا:

{
  (your pre-existing settings here)
}

أضف هذه الإعدادات الجديدة داخل مجموعة الأقواس الخارجية تلك:

{
  "[ocaml][ocaml.interface]": {
    "editor.tabSize": 2,
    "editor.rulers": [ 80 ],
    "editor.formatOnSave": true
  },
  (your pre-existing settings here)
}

احفظ الملف وأغلق التبويب.

استخدام VS Code تعاونيًا

تجعل إضافة Live Share في VS Code التعاون على الشيفرة مع أشخاص آخرين أمرًا سهلًا وممتعًا. يمكنكم تحرير الشيفرة معًا كالتعاون داخل مستند Google. وهي تدعم حتى قناة صوتية مشتركة، فلا حاجة إلى بدء مكالمة Zoom منفصلة. لتثبيت Live Share واستخدامها، اتبع البرنامج التعليمي من Microsoft.

إذا كنت طالبًا في جامعة كورنيل، فسجّل الدخول بحساب Microsoft وليس بحساب GitHub. أدخل بريدك الإلكتروني الخاص بمعرّف NetID في كورنيل، مثل your_netid&#64;cornell.edu. وسينقلك ذلك إلى موقع تسجيل الدخول الخاص بكورنيل. استخدم كلمة المرور المرتبطة بمعرّف NetID لديك.