في هذا الدرس والدرس القادم سأتحدث بالتفصيل عن سلاسل الرموز Strings في LISP ماهيتها وكيفية التعامل معها في LISP وكذلك الدوال المعرفة مسبقا في اللغة للتعامل معها أو إجراء عمليات عليها.
مكونات هذا الدرس:
أولا: تعريف السلاسل الرمزية STRINGS ؟
ثانيا: سلسلة الدوال المختصة بالتعامل مع سلاسل الرموز وهي 12 دالة سيتم شرحها في هذا الدرس.
وسندخل في درسنا مباشرة على بركة الله:)
أولا: ما هي سلسلة الرموز String؟
تستطيع معرفة هذا المصطلح عن طريق زيارة الوصلة التالية على قاموس الموسوعة العربية:
http://www.c4arab.com/qamoos/mean.php?word=Character%20String
هذا المفهوم لسلاسل الرموز لا يختلف بين جميع لغات البرمجة.
ثانيا: دوال التعامل مع سلاســــــل الرموز
Strings Functions..
وإليكم تعدادا ثم تفصيلا للدوال التي سيتم شرحها في هذا الدرس:
1- الدالة MAKE-STRING
2- الدالة STRING
3- الدالة STRINGP
4- الدالة STRING-UPCASE
5- الدالة STRING-DOWNCASE
6- الدالة STRING-CAPITALIZE
7- الدالة NSTRING-UPCASE
8- الدالة NSTRING-DOWNCASE
9- الدالة NSTRING-CAPITALIZE
10- الدالة STRING-TRIM
11- الدالة STRING-LEFT-TRIM
12- الدالة STRING-RIGHT-TRIM
1- الدالة MAKE-STRING
الوظيفة:
تعود هذه الدالة بسلسلة من الرموز بالطول الذي تم تحديده، وإذا تم تحديد العنصر الابتدائي فانه يتم ملئ السلسلة بهذا العنصر .
ملاحظة: هذا الدالة شبيهة جدا بدالة هامة تستخدم لصناعة القوائم lists واسمها MAKE-LIST وسيتم شرحها في الجزء الخاص بالقوائم لكونها عماد لغتنا الرائعة LISP في القسم المتقدم من هذه الدروس بإذن الله.
الشكل:
(make-string size [:initial-element element-type])
أمثلة:

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

رأينا أنه تم إنشاء سلسلة مكونة من 10 رموز، وسيتم ملؤها مبدئيا بالحرف a. تابع المثال التالي أيضا:

2- الدالة STRING
الوظيفة:
هذه الدالة تعود برمز أو سلسلة من الرموز حسب حالة x الذي تم إرساله لها.
-
إذا كان x عبارة عن سلسلة من الرموز String فان الدالة تعود بها.
-
إذا كان x عبارة عن رمز Symbol فان هذه الدالة تعود باسمه.
-
إذا كان x عبارة عن حرف Character فان هذه الدالة تعود بـString تحتوي على هذا الرمز فقط.
الشكل:
(string x)
أمثلة:

3- الدالة STRINGP
الوظيفة:
الشكل:
(stringp object)
أمثلة:

لاحظ في المثال السابق أنه من الممكن أن تحتوي السلسلة على رمز أو حرف وحيد، ولكن العكس صحيح!
فلا يمكن أن يكون الـCharacter محتويا على أكثر من رمز أو حرف.

وهاهي الدالة STRINGP تكشف عن الرمز Character الذي قمنا بإرساله لها لأن علامة الرمز # موجودة قبله.
4- الدالة STRING-UPCASE
الوظيفة:
تعود هذه الدالة بنفس السلسلة String المرسلة لها مع استبدال جميع حروفها إلى صيغة الحروف العلوية Upper-case Letters أي الحروف الكبيرة Capital Letters.
وللتوضيح فإن هذه الدالة تؤدي عمليها عن طريق تطبيق الدالة char-upcase التي تعرفنا عليها في درس " دوال التعامل مع الرموز Characters " على كل حرف من حروف السلسلة.
الشكل:
(string-upcase string [:start index] [:end index])
أمثلة:


5- الدالة STRING-DOWNCASE
الوظيفة:
تقوم هذه الدالة بالوظيفة العكسية للدالة السابقة، حيث تعود بنفس السلسلة String المرسلة لها مع استبدال جميع حروفها إلى صيغة الحروف السفلية Down-case Letters أي الحروف الصغيرة Small Letters.
وهذه الدالة تؤدي عمليها عن طريق تطبيق الدالة char-downcase التي تعرفنا عليها في درس " دوال التعامل مع الرموز Characters " على كل حرف من حروف السلسلة.
الشكل:
(string-downcase string [:start index] [:end index])
أمثلة:


6- الدالة STRING-CAPITALIZE
الوظيفة:
تعود هذه الدالة بنسخة من السلسلة String المرسلة لها مع استبدال حالة الحرف الموجود في بداية كل كلمة إلى حرف علوي Upper-Case Letter.
الشكل:
(string-capitalize string [:start index] [:end index])
أمثلة:




الدوال STRING-UPCASE, STRING-DOWNCASE, STRING-CAPITALIZE السابقة تقوم بإعادة السلسلة دون تحديث المتغير الذي يحويها.. أي أنه على سبيل المثال، لو وضعنا السلسلة “C4arab” كقيمة لمتغير ما وليكن x كالتالي:

ثم قمنا بتطبيق الدوال السالفة الذكر على هذا المتغير كالآتي:



فكما نلاحظ أن المتغير x لا يزال يحتفظ بنفس شكل السلسلة "C4arab" داخله بالرغم من تطبيق الدوال السابقة عليه.. ماذا لو أردنا الاحتفاظ بالشكل الجديد للسلسلة؟!!
هناك طريقتين لذلك:
الطريقة الأولى:
استخدام setq لنجعل الشكل الجديد للسلسلة والناتج عن تطبيق إحدى الدوال السابقة يتخزن داخل المتغير x .. فمثلا لو أردنا تطبيق الدالة string-upcase على السلسلة المخزنة في x ومن ثم الاحتفاظ بالعائد من الدالة داخل هذا المتغير نكتب:

الطريقة الثانية:
استخدام الدوال NSTRING-UPCASE, NSTRING-DOWNCASE, NSTRING-CAPITALIZE والتي تقوم بنفس وظيفة الدوال السابقة ولكن مع تخزين السلسلة العائدة في المتغير المرسل لها..
7- الدالة NSTRING-UPCASE
الوظيفة:
تقوم هذه الدالة بنفس وظيفة الدالة STRING-UPCASE مع تخزين السلسلة الجديدة في المتغير المرسل لها.
الشكل:
(nstring-upcase string [:start index] [:end index])
أمثلة:
بفرض أننا قمنا بتخزين السلسلة C4arab.Com في المتغير str على النحو الآتي:

وبتطبيق الدالة nstring-upcase:

سنجد أن المتغير str احتفظ بالسلسلة الجديدة العائدة من الدالة السابقة:

8- الدالة NSTRING-DOWNCASE
الوظيفة:
تقوم هذه الدالة بنفس وظيفة الدالة STRING-DOWNCASE مع تخزين السلسلة الجديدة في المتغير المرسل لها.
الشكل:
(nstring-downcase string [:start index] [:end index])
أمثلة:


9- الدالة NSTRING-CAPITALIZE
الوظيفة:
تقوم هذه الدالة بنفس وظيفة الدالة STRING-CAPITALIZE مع تخزين السلسلة الجديدة في المتغير المرسل لها.
الشكل:
(nstring-capitalize string [:start index] [:end index])
أمثلة:


المزيد من الدوال:
10- الدالة STRING-TRIM
الوظيفة:
تعود هذه الدالة بجزء من السلسلة المرسلة لها يحتوي على جميع الحروف الموجودة في السلسلة الأصلية باستثناء المحتوي على مع إزالة الأجزاء المحتوية على الـ character-bag من بداية أو نهاية السلسلة.
الـ character-bag هو الجزء الذي نرغب بمسحة وإزالته من السلسلة ونقوم بإرساله إلى هذه الدالة مع السلسلة كما سنرى في الأمثلة..
الشكل:
(string-trim character-bag string)
أمثلة:



11- الدالة STRING-LEFT-TRIM
الوظيفة:
تقوم هذه الدالة بنفس وظيفة الدالة STRING-TRIM ولكنها تقوم بعملية الإزالة للـ character-bag من بداية الـString فقط..
الشكل:
(string-left-trim character-bag string)
أمثلة:


12- الدالة STRING-RIGHT-TRIM
الوظيفة:
تقوم هذه الدالة بنفس وظيفة الدالة STRING-TRIM ولكنها تقوم بعملية الإزالة للـ character-bag من نهاية الـString فقط..
الشكل:
(string-left-trim character-bag string)
أمثلة:

