لنبدأ الآن بتعلم هذه اللغة الشيقة,يكفي أنها ستفيدنا في عمل تطبيقات لأجمل وأروع علوم الحاسب الآلي "الذكاء الاصطناعي Artificial Intelligence " وهذا يعطينا دفعة قوية لنتعلم اللغة معا مع تطوير أنفسنا ذاتيا بالقراءة والمران والتجربة.
قبل البدء:
* من هذا الدرس فصاعدا سأكتب LISP بدلا من Common Lisp للتبسيط والاختصار. مع العلم أنني لم أتناول إلا الصيغ والدوال الموجودة في لغة Common Lisp القياسية.
* بصراحة لم أحب ترجمة المصطلحات الأجنبية الشائعة في هذه اللغة، بل تركتها مثلما هي مع كتابة المرادف العربي إن وجد بجانبها.. والسبب الوحيد لذلك هو أنني أريد تسهيل قراءة المراجع الأجنبية عندما تريد تعلم المزيد عن هذه اللغة فلا يوجد أبدا للأسف مراجع عربية في هذا المجال.. فإذا ما قلت كل شيء بالعربي دون الإشارة إلى المصطلح الأجنبي فان هذا يعني أنه من الصعب وقد يكون من المستحيل الربط بين دروسي هذه وبين ما تقرؤه في المراجع..
والله من وراء القصد.
المراجع التي اعتمدت عليها في هذه الدروس:
المرجع الأول: الـDocuments الموجودة مع البرنامج.. فهي كتاب متكامل يشرح هذه اللغة وتفاصيلها الدقيقة.. وصانع الشيء خبير به أكثر من غيره :)
المرجع الثاني: كتاب Common Lisp
A Gentle Introduction to Symbolic Computation
المرجع الثالث: Artificial Intelligence
Structures and Strategies for Complex Problem Solving
وكذلك بالإطلاع على عدد كبير من المواقع الأجنبية المتخصصة في هذا المجال.
سندخل اليوم في مقدمة عن الصيغ الرمزية والقواعد اللغوية وبعض الأمثلة البسيطة ولن أتكلم فيه عن دوال بعينها فذلك سيكون في الدروس القادمة إن شاء الله.
الصيغ الرمزية، والقواعد اللغوية
في لغة Common Lisp
تعتمد لغة LISP في صياغتها على ما يسمى بالصيغ الرمزية أو الصيغ التي تستخدم الرموز Symbolic Expressions ويطلق عليها اختصارا s-expressions.
والصيغ الرمزية s-expressions توجد في صورتين:
-
إما أن تكون atom
-
أو في صورة list
ما هو الـ Atom ؟
يعتبر الـAtom وحدة بسيطة جدا في اللغة بحيث لا يمكن أن يتم تبسيطها لأكثر من ذلك.. يمكن أن يتضمن الـAtom حروف أو أرقام أو رموز.
أمثلة على بعض الـ Atoms :
3.1416
100
x
c4arab
*some-name*
nil

ما هو الـ List ؟
عبارة عن سلسلة من الـ Atoms أو من الـ Lists يفصل بينها بالمسافات Blank spaces وتحاط بأقواس دائرية ( ).
فالقائمة list هي عنصر غير بسيط Non-atomic في LISP.
أمثلة على القوائم Lists:
; قائمة تحتوي على الأرقام من 1 إلى 4
(1 2 3 4)
; قائمة تحتوي على أسماء مجموعة من الطلاب
(Mohammad Thamer Rashed Yaser)
; قائمة تحتوي على قوائم أخرى بداخلها
( a (a b) (d (e f)))
; قائمة فارغة
( )

نلاحظ أن الـlist يمكن أن تكون عنصرا في list أخرى.. وهذا الشكل قد يكون مفيد جدا في إنشاء هياكل Structures متداخلة وبأي درجة من التعقيد..
وسنرى أن لذلك فوائد عديدة جدا أثناء التطبيقات والأمثلة وفي المشاريع المتقدمة بإذن الله.
بالنسبة للقائمة الفارغة Empty List فهي تلعب دور خاص عند إنشاء ومعالجة هياكل البيانات Data Structures وتسمى غالبا بالاسم nil في لغة LISP.
نتيجة:
يعتبر nil العنصر الرمزي s-expression الوحيد في لغة LISP الذي يعتبر من كلا النوعين Atom و List في الوقت ذاته!
والآن، كنت قد تحدثت كثيرا في الدروس السابقة عن النماذج Forms وطريقة عمل Evaluation لها،
فما هو الـ Form ؟
النموذج أو الـForm ما هو إلا تعبير رمزي s-expression يتم عمل تقييم evaluation له على أداة الـ Listener أو الـ Text Editor للحصول على نتيجة معينة.
إذن فالـ Form قد يكون Atom أو List. وعندا يكون عبارة عن list فان العنصر الأول يعامل كاسم للدالة function name وبقية العناصر تعامل كأنها متغيرات الدالة function arguments.
مثال على ذلك: عندما نكتب قائمة مكونة من الأحرف x, y, z بالشكل التالي:
(x y z)
فانه سيتم اعتبار x كاسم للدالة function name وسيتم اعتبار y و z المتغيرات التي يتم تمريرها إلى الدالة function arguments.
ماذا يحدث عند عمل تقييم Evaluation لأي تعبير رمزي s-expression ؟!
تعلمنا في القسم المبتدئ من هذه الدروس كيفية عمل تقييم أو تقدير Evaluation عن طريق أداة الـ Listener أو أداة الـ Text Editor.
فماهي ياترى نتيجة التقييم لأي s-expression ؟
ستكون واحدة من ثلاث حالات:
-
عندما يكون الـ s-expression عبارة عن رقم number ، فانه سيتم إعادة هذا الرقم.
-
عندما يكون الـ s-expression عبارة عن atom فانه سيتم إعادة قيمة ذلك الـatom فيما إذا تم تخصيص قيمة مسبقا له، وغير ذلك سينتج لنا error.
-
عندما يكون الـ s-expressionعبارة عن List ، فانه سيتم عمل تقييم لعناصر القائمة بدءا من العنصر الثاني وحتى العنصر الأخير، ومن ثم إرسالها إلى الدالة إلى لها الاسم الموجود في أول عنصر في القائمة.
بفرض انه تم كتابة أي من الـarguments أو اسم الدالة بشكل خاطئ، أو بفرض انه لم يتم تعريف دالة تحمل الاسم المخصص في أول عنصر في القائمة مسبقا فانه سينتج لنا رسالة Error.