أهلا بك فى عالم البرمجة بلغة رينج Welcome to Ring programming

مرحبا بكم جميعا !

سنتعلم معا من خلال هذه المدونة العمل على لغة البرمجة رينج Ring

ringlogo

لغة الرينج هى عبارة عن لغة برمجة احترافية جديدة صدر الاصدار الاول منها فى 25 يناير 2016 وهى تعنى (الخاتم) وقد تم تطويرها من قبل المهندس محمود سمير فايد بداية من سبتمبر 2013 وهى لغة برمجة تشبه لغات مثل بايثون Python وروبى Ruby من حيث كونها ديناميكية Dynamic وتدعم عدة انماط للبرمجة إلا أنها تتميز عنهم بالكثير من المزايا فيما يخص ال Declarative Programming وال Natural Programming وهى انماط برمجة تركز على البساطة ووصف مايريده المبرمج مباشرة.

اللغة يمكنك استخدامها لعمل تطبيقات متنوعة كالتالى :

  • تطبيقات تستخدم الواجهة الخطية Console Application
  • تطبيقات تستخدم الواجهة الرسومية GUI Application
  • تطبيقات ويب Web Application
  • تطبيقات موبايل Mobile Application
  • الألعاب  Games

فى البداية عليك بتحميل اخر اصدارات اللغة من الموقع التالى : http://ring-lang.net

بعد التحميل وفك الضغط وليكن فى المسار : c:\ring على سبيل المثال

قم بتشغيل ملف التنفيذ

startring.png

وفيما يلى صورة لمحرر الكود (التعليمات البرمجية) Code Editor الخاص باللغة

وهو محرر تم كتابته بلغة ال Ring ويستخدم المكتبة Qt من اجل الواجهات الرسومية GUI

niceshot

تنقسم نافذة المحرر الى عدة اجزاء وهى:

  • مكان لكتابة الكود Source Code
  • متصفح بسيط Web Browser يستخدم فى البداية لعرض التوثيق الخاص باللغة Ring Documentation
  • مستعرض ملفات المشروع Project Files يستخدم لفتح اى ملف بشكل سريع
  • شرط القوائم Menu Bar وهى File و Edit و View و Program و Browser و Help
  • شريط الادوات للتعامل السريع مع الملفات وتشغيل البرامج Tool Bar
  • شريط الحالة لعرض رقم السطر وعدد الاسطر فى الملف المفتوح Status Bar

والان قد وصلنا لنهاية هذه المقالة وهى مجرد بداية بسيطة تعرفنا من خلالها على

  • ماهى لغة الرينج
  • تحميل الإصدار الأخير
  • تشغيل بيئة العمل

وإلى اللقاء …

للاطلاع علي المقالات الاخري المتعلقة باللغة من هنا

كيف تستخدم ال GITHUB في المشاريع

 

Generating Web Pages using Functions

أهلا بكم جميعا

تحدثنا في اخر مقالة عن عمل صفحة الويب باستخدام ال Objects.واليوم نستخدم  Hash Function لكل عنصر في صفحة الويب كما سنري في هذه المقالة،و نوضح أمثلة لصفحات ويب والتحكم فيها  بلغة الرينج.

ونقوم بشرح الخطوات بداية من التعامل مع قواعد البيانات  SQL الي التعامل مع صفحات ال Front End  وهي صفحة ال User interface  او الواجهة الامامية للمستخدم ثم نعرض صفحات ال Back End  وهي صفحات ال Responses  للتعامل والتحكم في البيانات المدخلة من المستخدمين في الصفحات الامامية.

وسوف نستخدم ال MYSQL وبالتالي يجب تنزيلها وعمل Configuration لها كما هو موضح هنا

اما بالنسبة للسيرفر فيوجد apache جاهز داخل اللغة.

ولنبدأ باسم الله

عند انشاء صفحة ويب بال Hash Function تكون بداية ونهاية أي style ب start,end مع استخدام دوال ال Hash لادخال ال attributes الخاصة بال styles.

مثال:

هذا هو ال style بال HTML:

4.PNG

  • سوف نستبدل أي تاج <>بstart,end  ونضع ال attributes  داخل دالة ال hash، وكما قلنا أن أي نص يأخذ ال text  parameter.

هذا هو ال style بلغة الرينج:

7.PNG

  • ويكون دوال ال Hash  داخل object ال {} New Page

8.PNG

وهذا شكل الخرج علي المتصفح:

9.PNG

10.PNG

الكود

11.PNG

وهذا مثال اخر علي ال Gradient – التدرج في الالوان-  صفحة ويب بال Gradient ك background:

1.PNG

2.jpg

الكود

وبهذا نكون عرفنا كيفية عمل صفحة ويب عن طريق hash functions.

أولا قواعد البيانات:

نقوم بعمل قاعدة بيانات ولك حرية الاختيار في البرنامج الذي تختاره لعمل ذلك، طالما أنك وصلت الي لغة البرمجة المسؤلة عن التحكم في صفحات الويب فمن المفترض أن يكون لك القدرة علي التعامل مع قواعد البيانات وكذلك الصفحات الامامية للويب.

ونقوم بالعمل علي برنامج MYSQL Workbench

نقوم بانشاء قاعدة البيانات بما تحتوي علي جداول وأوامر للتعامل مع صفحة الويب التي نقوم ببرمجتها.

كما أن هناك قاعدة بيانات جاهزة للمهندس محمود فايد – مبتكر اللغة- خاصة ببيانات العملاء وتسجيل دخولهم ،… كما في الامثلة الموضحة في هذا الموقع نقوم بفتح قاعدة البيانات كالتالي:

نقوم نفتح ال Workbench ثم نتبع الخطوات التالية كما في الصور الموضحة…

1.png

نقوم بعمل الاتصال بالسيرفر…

2.png نقوم بادخال ال username & password

3.png

4.png

نقوم بفتح قاعدة البيانات الجاهزة- Script.

1.png

2.jpg

3.png

نقوم بعمل Run    للتأكد من صحة ال Script

4.PNG

3.jpg

4.jpg

تستطيع فتح ال shell الخاص ب mysql   من   Start   وتطلع علي قواعد البيانات التي لديك كما يمكن أن تنشأ قاعدة بيانات لتوريد البيانات اليها.

أولا يجب عليك انشاء قاعدة بيانات بأي اسم.

;create database if not exists mahdb

ثانيا نقوم باستخدام هذه القاعدة في ال Script لتوريد البيانات اليها.

;use mahdb

2.jpg ثم  نقوم بعمل Save ثم Run والتاكد من صحة ال Script.

3.jpg

نقوم باختبار البيانات داخل قاعدة البيانات الجديدة mahdb.

4.PNG

ومن ثم نكون جاهزين للتحكم في صفحة الويب الخاصة بتسجيل بيانات العملاء من خلال القاعدة mahdb.

ولكن قبل ذلك ينبغي معرفة كيفية تقسيم المشروع قبل البدء فيه والتعرف علي MVC من هنا

وأن تطلع علي مكتبة ال datalib.ring والتي سوف نقوم بعمل صفحات الويب عن طريقها ك framework من هنا 

يمكن أن تنشأ قاعدة بيانات جديدة تتناسب مع صفحة الويب والبيانات المدخلة.

  مثال لقاعدة بيانات تحتوي علي سورة الفاتحة بالترميز العربي من داخل قاعدة البيانات:

نقوم بعمل قاعدة بيانات جديدة كالتالي ثم نستخدمها في ال SQL

1.png

سوف استخدم ال workbench  لعمل قاعدة البيانات :

من file نختار New Query ثم نقوم بكتابة ال Sql  بعد تحديد قاعدة بيانات نعمل عليها ونقوم بالحفظ وليكن باسم Quran  ثم نقوم بعمل Run

3.png

2.jpg

4.png

في هذا المثال سوف أقوم بادخال البيانات باللغة العربية بترميز UTF8 في قاعدة البيانات ولكي تستجيب صفحة الويب لهذا الترميز فينبغي  علي ال Server  وقاعدة البيانات أن يتعرفوا علي هذا الترميز فنقوم بكتابة ال query الخاصة بالترميز بعد عمل اتصال مباشرة في مكتبة ال datalib وكذلك في ال  database

5.png

وسوف اغير عدد ال records   في الصفحة الواحدة  في مكتبة ال  datalib  ولك الحرية في اختيار عدد السجلات:

6.png

أو من الممكن عمل inheritance لل class المراد تغيير ال attributes بداخله في الملف الخاص بالمشروع ثم تغيير هذا ال attribute.

وكذلك سوف أقوم بتغيير اسم قاعدة البيانات والباسورد:

7.png

ثم نقوم بعمل ملف المشروع نستدعي فيه مكتبة ال datalib  لاظهار الصفحة الخاصة بنا:

1.jpg

2.jpg

هو نفس مثال ex24.ring  لل salary  مع تغيير المتغيرات التي لدينا

ويجب ملاحظة أن يتم كتابة اسم ال cLass قبل MODEL & CONTROLLER & View  مباشرة وهو اسم الجدول داخل قاعدة البيانات وهو ما يتم تغييره في الملف بالضغط علي ctrl+f وعمل replaceAll  ل salary الي Quran ، وكذلك يجب التأكد من اسم ال Website في ملف المشروع أن يكون بنفس اسم المشروع.

وهذا الشكل الناتج في صفحة الويب باللغة العربية:

2.png

ومن الممكن اظهار الصفحة بأي لغة

يكون ذلك عن طريق تغيير اسماء ال Attributes  في ال Class الخاص باللغة كالتالي:

3.jpg

pic3.PNG


وفي هذا المثال سأقوم بعمل import  لقاعدة بيانات للقران الكريم كاملا.

من الممكن تحميل المشروع كاملا بال Scripts الخاصة بقواعد البيانات من هنا 

نقوم بفتح  ال Script  الموجودة باسم allquran.sql ،  ثم نقوم بالحفظ وعمل Run ليتم توريد البيانات الي قاعدة البيانات التي أنشأناها باسم allquran.

ونقوم باضافة السطر الخاص بالترميز في قاعدة البيانات المستخدمة اذا لم يتم كتابته في ال Script .

;SET NAMES utf8

وسوف أقوم باضافة عمود في ال grid في صفحة الويب ويكون التعديل كالتالي:

3.jpg

5.jpg

وهذه هي الصفحة الناتجة

pic1.PNG

2.png

يمكنك تحميل المشروع كاملا ومعدلا بكل ما تم شرحة من هذا اللينك علي ال Github.

فقط عليك فتح ال Scripts الموجودة في ملف ال database بال Workbench كما وضحنا ونقوم بعمل Run لتوريد البيانات لقاعدة البيانات لديك ثم تقوم بفتح مسار المشروع الذي تم تحميلة كما في الصورة التوضيحية وتقوم بتغيير الباسورد في ملف ال datalib2,datalib.

2.jpg

وشكرا لكم والي اللقاء

للاطلاع علي المقالات الاخري من هنا

تستطيع الاطلاع علي المشاريع مفتوحة المصدر من الموقع  GitHub
الموقع الرسمي للغة  http://ring-lang.net

كيف تستخدم ال Github في المشاريع

 

Generating Web Pages using Objects

أهلا ومرحبا بكم جميعا

نقدم لكم في هذه المقالة form بسيط بلغة رينج حيث أنها تدخل في التطبيقات المختلفة للويب ونوضح اليوم  عمل تطبيق صفحة ويب لادخال بيانات المستخدمين، ومن ثم صفحة أخري نعرض فيها ال response أو البيانات التي تم ادخالها بكلا طريقتي ال HTTP Get &HTTP Post

ونحتاج الي بعض الاعدادت قبل البدء في الشرح:

1-هنحتاج الي server يدعم CGI وليكن Apache HTTP Server

ومن هنا شرح بالصور طريقة تنزيل ال Apache والاعدادات الاخري قبل البدء.

ملحوظة:

في الاصدار الجديد من لغة الرينج Ring 1.6 تم تركيب Apache  في اللغة دون الحاجة الي تلك الخطوات فقط عليك بالضغط علي زر واحد وهي علامة الويب في أعلي المحرر كما في الشكل التالي:

5.jpg

بعد تحميل الاصدار الجديد من صفحة اللغة http://ring-lang.net   ثم الضغط علي زر الويب تعرض صفحة الويب تلقائيا.

ملحوظة أخري:

  • مجرد أن يتم الضغظ علي زر الويب يتم فتح ال appache ويتم فتح صفحة الويب من أي مكان علي الجهاز لديك ولكن بعد فتح أول صفحة ويب وفتح ال appache  يتم تخزين ذلك المسار ولا يعرض بعدها أي صفحة ويب خارج ال directory الذي يحتوي علي صفحة الويب المعروضة حتي يتم عمل restart لل appache مرة أخري ومحرر اللغة ثم تستطيع تغيير مسار ال directory بأول صفحة يتم فتحها.
  •  يتم عمل  restart لل appache  عن طريق عمل restart لجهاز الكمبيوتر أو من الممكن فتح ال task manager وغلق اي appache   مفتوح – عن طريق عمل كليك يمين من ال task bar أو alt+ctrl+delete ثم نختار task manager ثم نعمل end task لل appache.

2.jpg

2-يجب تعريف السطر التالي في أول سطر في البرنامج قبل البدء في كتابة أي كود:

c:\ring\bin\ring.exe -cgi!#

ويختلف مساره من جهاز لاخر حسب مسار تواجد ملف ال execution

فهذا مسار تواجده علي جهازي c:\ring\bin\ring.exe ثم نضع !# قبل المسار و cgi- بعد المسار وينبغي أن يتم كتابة هذا السطر في أول سطر في البرنامج

3-يجب استدعاء مكتبة ال Web و عمل import.

"Load "weblib.ring
Import System.Web

4-واخيرا يجب معرفة أساسيات ال web design حتي يتسني لنا معرفة كل جزء بسهولة وطريقة الاستخدام.

من الممكن اختبار ال apache عند فتحه  أول مرة بفتح صفحات الويب في ال examples الجاهزة في المسار  ring\ringlibs\weblib\ringapp

ولنبدأ بسم الله:

Generating Pages using Objects

يوجد أكثر من طريقة في لغة الرينج  لبرمجة صفحات الويب، من الممكن استخدام ال Html  مباشرة ،ومن الممكن استخدام ال Functions عن طريق دوال ال Hash، وأيضا استخدام templates ، وكذلك Objects. وكل نوع يختلف عن الاخر في السرعة

فأسرع طريقة هو كتابة كود ال HTML مباشرة ثم استخدام ال Functions ثم ال Templates ثم ال Objects

ونستخدم في هذه المقالة ال Objects  وكما قلنا أنها بطيئة الا أنها سهلة الاستخدام وتعطي style سهل جميل كما سنري في هذه المقالة حيث أننا  نستخدم nested structures  عن طريق الاقواس {}  لكل Object ثم ندخل بداخلها مجموعة ال attributes المستخدمه .وتستطيع أن تطلع علي ال attributes الموجودة في لغة الرينج باستخدام Class ال WebPageمن هنا

  • وسوف نبدأ من بداية شكل الكود بال HTML وادخالة في لغة رينج خطوة بخطوة.

شكل الكود في لغة ال HTML :

<"form name="reg" action="post>
</ "input type="text" name="username>     
<label>Name</label>     
</ "input type="email" name="email>     
<label>Email</label>     
</ "input type="tel" name="tel>     
<label>Telephone</label>     
</ "input type="password" name="password>     
<label>password</label>     
</ "input type="submit" name="submit" value="send>     
<label>Submit</label>     
</form>
  • أي نص يتم وضعة بالشكل التالي:  ( النص “)text
  • وأي تاج <>يكون عبارة عن object ويتم ادخال مجموعة ال attributes عن طريق الاقواس {}
  • ومجموعة ال objects تكون داخل ال ()WebPage

كما هو موضح في هذا الكود

ثم بعد ذلك نقوم بوضع ال styles لتظبيط شكل الصفحة:

ويكون ذلك عن طريق style=  style-name وممكن الدمج بين أكثر من style عن طريق +

ومن هنا تستطيع الاطلاع علي الاستايل الموجودة في لغة الرينج

وهذا شكل ال form بعد وضع النص في div خاص به  وكذلك مربعات النص في div اخر خاص به ليعرضهم علي هيئة blocks ووضعت ال styles الخاص بكل div.

كما هو موضح هنا في هذا الكود 

3.PNG

أما هنا فوضعت ال form علي هيئة جدول كل صف يحتوي علي النص ومربع ادخال النص

كما هو موضح في هذا الكود

2.PNG

Hypertext Transfer Protocol) HTTP):

يستخدم لعمل اتصال بين المستخدم user  والسيرفر server علي هيئة Request &Response،يقوم المستخدم بالاتصال بالسيرفر علي هيئة Request ثم يستجيب السيرفر لهذا الطلب علي هيئة Response.

والان سوف نعمل صفحة response الخاصة بالسيرفر نعرض فيها كل الداتا التي تم وضعها في مربعات الادخال عن طريق ال User.

ويوجد طريقتان لعمل ذلك:

1.   HTTP Get

  • في هذه الطريقة نضع “method=“get داخل تعريف ال form  كما   في هذا الكود
  • وكذلك “action=response.ring وهي الصفحة التي سوف ننشأها لنعرض فيها البيانات المدخلة.

وهذا الطريقة تعرض البيانات التي ادخلها المستخدم في أعلي المتصفح في صفحة ال response، حيث تحصل علي البيانات المدخلة من السيرفر علي هيئة Get request.

  • ولتوضيح ذلك  نقوم بعمل برنامج جديد باسم response.ring
  • ونقوم بنفس الخطوات التي ذكرناها سابقا في انشاء صفحة الويب
  • ثم نقوم بمعالجة القيمة المدخلة من المستخدم عن طريق  [”        “]aPageVars
{(["       "] p{ text ( aPageVars
  • ال aPageVars تمثل قيم المتغيرات التي أدخلها المستخدم في صفحة ال front end
  • و text حتي تقوم بعرض المتغيرات المدخلة
  • و تعمل علي عرض text  علي هيئة سطور
  • وبداخل ال ” “ نضع  قيمة المتغير الذي تم تعريفة داخل مربعات النص {}inputs ليتم التعرف علي البيانات بداخل كل مربع نصي.
  • وليكن المتغير هو ال name فنضع القيم الخاص بكل مربع كما في هذا الكود
  • ونضع ما نحب من باقي مكونات الصفحة وال styles الخاصة بها.

كما هو موضح في هذا الكود

وهذا الشكل الناتج و نلاحظ أن المدخلات موضحة في أعلي الصفحة.

4.png

2.   HTTP Post

هي نفس طريقة ال Get  ولكن الاختلاف فقط  في أننا  نضع “method=”post  داخل تعريف ال form كما في هذا الكود

وهذا الطريقة تخفي البيانات التي ادخلها المستخدم في أعلي المتصفح في صفحة ال response ، حيث يتم حفظ البيانات في ال Body وارسالها للسيرفر مغلقة .

وهذا الشكل الناتج و نلاحظ أن المدخلات لا تظهر في أعلي الصفحة.

3.png

ونكتفي بهذا والي اللقاء والسلام عليكم ورحمة الله وبركاته

للاطلاع علي المقالات الاخري من هنا

تستطيع الاطلاع علي المشاريع مفتوحة المصدر من الموقع  GitHub
الموقع الرسمي للغة  http://ring-lang.net

Stdlib Functions and Classes

بسم الله الرحمن الرحيم
لغة الرينج  هي لغة مجانية مفتوحة المصدر تسمح لك بالتعديل والاضافة وعمل المكتبات،ويوجد فيها مكتبة تسمي ب “stdlib.ring”
وهي المكتبة  القياسية للغة ، تحتوي علي الدوال التي تحدثنا عنها في المقالات الخاصة بأساسيات اللغة مع بعض الدوال الجديدة  وأيضا تحتوي علي   Classes كما سنري معا من خلال هذه المقالة.

وياستخدام تلك المكتبة ومعرفة وظيفة كل دالة وكل class سوف توفر علينا الوقت والجهد والسطور البرمجية باستدعاء الدوال وال Objects مباشرة فهي تعنمد في بنائها علي أساسيات اللغة.


1-Stdlib Functions

الجدول التالي يوضح الدوال الموجودة في المكتبة: 3.png

قبل استخدام أي من تلك الدوال يجب عليك استدعاء مكتبة ال stdlib.ring كالتالي:

"load "stdlib.ring

ثم بعد ذلك يمكنك استخدام اي من تلك الدوال مباشرة كما هو موضح في موقع اللغة

ولمعرفة المزيد عن كيفية عمل الدوال يمكنك الاطلاع علي مكتبة عمل الدوال مباشرة من هنا

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

ثم وضع الدوال الخاصة بذلك في تلك المكتبة ثم استدعاء المكتبة في ملفات أخري واستدعاء اسم الدالة.

كما تعرفنا في مقالة ال Program Structure

أو من الممكن وضعها في مكتبة ال “stdcore.lib”  لتكون ضمن مكتبة ال “StdLib.ring”

مثال توضيحي باستخدام المكتبة بعد وضع دوال جديدة بداخلها.

"load"stdlib.ring
see Startswith2("myfile.txt","hello")+nl
see IsVowel2("Ring")+nl
see IsVowel2("unit")+nl
see capitalAllFirst("hello in ring lan., it is a powerful ")+nl

مثال1:

"load "stdlib.ring
#في هذه الدالة يطبع وينزل مباشرة بسطر جديد
("Puts("now we will print with new line by this func
("print("Hello,How are you?\nI'm fine!\t thanks\n
#في هذه الدالة عملنا شرط بأن يتم أخذ القيمةالمتغير الي بعد الهاش # و }
#وكذلك وعمل مسافات باستخدام t\ ونزول سطر جديد باستخدام n\
}for x=1 to 10
("print("#{x}\n
{

مثال2:

"Load "stdlib.ring
("puts("please put your name
#تستخدم لادخال الداتا من المستخدم عن طريق لوحة المفاتيح
()x=getstring
 ("{print("hello #{x

مثال3:

"Load "stdlib.ring
("puts("please put your name
#تستخدم لادخال الداتا عن طريق لوحة المفاتيح وتطبعها علي انها حرفية
()x=getstring
("print("hello #{x}\n
("puts("what is your age
#تستخدم لادخال الداتا عن طريق لوحة المفاتيح وتطبع الرقمي فقط
()y=getnumber
("{print("#{y

مثال4:

"Load "stdlib.ring
#لمعرفة مسار التطبيق المفتوح
see AppPath()+nl
#يحذف ملف ال exe ويطبع باقي المسار
see justfilePath("s:\newFolder\Test\rnote\x.exe")+nl
("see justfileName("s:\newFolder\Test\rnote\x.exe

مثال5:

"Load "stdlib.ring
aList = 1:10
#ينسخ قيمةالقائمة أو object مهما يحدث تغيير لا يؤثر علي قيمتة الاصلية في كل مرة
(del(value(aList),1
see alist[5]+5

مثال6:

"Load "stdlib.ring
#تستخدم لتكرار عدد معين من نوع الدوال ال Anonymous 
({{Times ( 2 , func { for x=1 to 10 {see x+nl

مثال7:

"Load "stdlib.ring
#في حالة وجود قائمة ودالة حيث ينفذ الدالة علي كل عنصر في القائمة
({See Map( [2,4,5], func x { return x*x

مثال8:

"Load "stdlib.ring
#ينزل سطر جديد بعد كل علامة (تم تحديدها بين "" )
#تم تحديد مسافة خالية للنزول بعد كل كلمة بعدها مسافة
See Split("one two three four five"," ")+nl
#تم وضع علامة الفاصلة للنزول بعد كل كلمة يوجد بعدها ,
See Split("one,two ,three ,four ,five",",")+nl

مثال9:

"Load "stdlib.ring
#تم تحديد "!" و "," و" " للنزول سطر جديد
 (" , ! " ,"See SplitMany("Hello in!Ring Language,it is nice ", "!, " )
"Load "stdlib.ring
/*
if n < 0 return -1 ok
if n = 0 return 0 ok
if n > 0 return 1 ok
*/
see "sign of 12 is = " + sign(12) + nl

مثال11:

"Load "stdlib.ring
#طباعة قيم القائمة داخل ملف
("list2file(1:100,"myfile.txt

مثال12:

"Load "stdlib.ring
#يحولStrings داخل الملف الي List 
("see file2list("myfile.txt

مثال13:

"Load "stdlib.ring
#بيختبر نفس حروف وقراءة الكلمة "بحيث من اليمين نفس اليسار"
("()Puts("Test Palindrome
cString = "AllA"
(see " "+Palindrome(cString

مثال14:

"Load "stdlib.ring
/*
Func MakeDir cDir
(system("mkdir " + cDir )

*/
("makedir("myfolder

مثال15:

"Load "stdlib.ring
 #"^'+-/\*~=@,%|&?!'"
#لاختبار اذا كان من الحروف الخاصة^'+-/\*~=@,%|&?!'
See isSpecial("%") + nl
See isSpecial("@") + nl
#لاختبار اذا كان من الحروف المتحركة"aeiou"
See isVowel("c") + nl

ونكتفي بهذا القدر من الدوال الموجودة في مكتبة Stdlib وللمزيد يمكنك الاطلاع عليها من موقع اللغة.


2-Stdlib Classes

عبارة عن Classes  بداخل عدة مكتبات ثم تم تجميعهم بداخل مكتبة StdLib وهما مجموعة ال Classes  الموضجين في الجدول التالي:

1.png

وتعرفنا في مقالات احري علي معظم ال Methods الخاصة بتلك  ال Classes االموضحين في الجدول، و نتعرف اليوم علي باقي ال Classes الاخري، وما يهمنا هو معرفة اسم ال Class المستخدم- لعمل Object من هذا ال Class عند استدعاء المكتبة واستخدام ال Methods الخاصة بهم وايضا ينبغي معرفة وظيفة وكيفية استخدام ال Methods.

1-ينبغي استدعاء مكتبة “Stdlib.ring”

2-عمل Object من ال Class المستخدم “الذي يحتوي علي ال Method المراد استخدامها”

لتوضيح عمل ال Methods بالامثلة  يمكنك الاطلاع عليها من الموقع الرسمي للغة من هنا

1-الMethods  الموجودة داخل ال Class ال StdBase

2.PNG

مثال توضيحي:

"Load "stdlib.ring
obase=new Stdbase
}obase
("Init("ring programming language
printLn() see size()+nl
()set ("ok,thanks") printLn
()see size
{

2-الMethods  الموجودة داخل ال Class ال String

2.PNG

مثال توضيحي:

"Load "stdlib.ring
oStr=new String
}oStr
("Init("ring programming language
see copy(2) see nl
()alist= tolist
see type(alist)+nl
()see split
{

3-الMethods  الموجودة داخل ال Class ال List

Capture.PNG

مثال توضيحي:

oList=new List
(["oList.init(["Hello
()olist.println
("olist.add("A") olist.add("B") olist.add("C") olist.add("D") olist.add("E")
()olist.print
()see olist.first#
((olist.Insert(1,olist.item(3
()olist.print

4-الMethods  الموجودة داخل ال Class الخاص بال Stack

3.PNG

ملحوظة: في ال Stack  يكون الاضافة بمبدأ “last in first” أي اخر واحد يتم اضافته يكون هو أول index

وعند عمل pop أو حذف يكون من اخر قيمة التي في أعلي ال Stack  أو اخر قيمة تم اضافتها.

5-الMethods  الموجودة داخل ال Class الخاص بال Queue

11.PNG

ملحوظة: في ال Queue  يكون الاضافة بمبدأ “first in first out” أي عند الاضافة يكون كالتالي: الاول يأخذ أول index والاخر يأخذ أخر ترتيب اخر index

وعند عمل Remove يكون الحذف بالترتيب أيضا أي يكون الحذف من أول index  أو أول عنصر تم اضافته.

مثال توضيحي:

"Load "stdlib.ring
ostk=new Stack
}oStk
()push("A") push("B") push("C") println
()pop() print
{
see copy("=",50) +nl
oq=new Queue
}oq
()add("A") add("B") add("C") println
()remove() print
{

6-الMethods  الموجودة داخل ال Class الخاص بال Hash Table

4.PNG

ال Hash Table عبارة عن جدول تجزئة يتم تطبيقه باستخدام المصفوفه Array  لتخزين البيانات بحيث يمكن الوصول السريع لأي بيانات نريدها مهما كان حجم تلك البيانات ، بالاضافه الى ادخال البيانات والاسترجاع والحذف بسرعه كبيره جدا. يحتوي علي مؤشر أو مفتاح للعنصر ويكون دالة في المحتوي الداخلي وقد يكون هذا ال index قيمة رقمية أو حرفية.

يفضل أن يستخدم في حال كانت البيانات التي تتعامل معها ثابته ولا تتغير ، وتريد الوصول لها في كل مره بشكل سريع ، مثلا البرامج التي تستخدم القاموس Dictionary يمكن أن تقرأ هذه القاموس وتضعه في بنيه Hash Table في الذاكره وقت تشغيل البرنامج.

مثال توضيحي:

5.jpg

الكود المرفق في الصورة

7-الMethods  الموجودة داخل ال Class الخاص بال Tree

1.PNG

ال Tree: هي طريقة لتمثيل البيانات علي هيئة شجرة حيث يتم التمثيل ب nodes أو عقد قد تحتوي علي جذر أو أكثر [children] ويوجدParentلكل مجموعة من ال Children.

وال node الاول الذي يندرج تحته ال Childs ولا يكون فوقه node يكون هو ال root.

اذا هي طريقة سريعة لتمثيل وعرض البيانات واسترجاعها والتعديل عليها بكل سهولةحيث يتم تمثيل البيانات علي هيثة tree تحتوي علي parents و Children.

استخدمنا هنا اثنين من ال attributes:

1-Data: وهي تمثل قيمة ال Nodes

2- Children:وهي عبارة عن قائمة تحتوي علي مجموعة ال Children

ملحوظة:

يتم عرض شجرة البيانات بترتيب حيث القيمة الاصغر تكون ناحية اليسار والقيمة الاكبر تكون ناحية اليمين.

ولهذا عند اضافة قيمة Child جديدة يكون بناء علي هذا الترتيب ان يكون قيم ال childs الي فوقه والي علي يمينه أكبر منه والي تحته والي علي يساره يكون أقل منه  كما سنوضح في الامثلة.

شكل توضيحي:

33.PNG

مثال توضيحي:

5.jpg

الكود المرفق في الصورة


وتعرفنا في مقالات سابقة عن الدوال الخاصة بقواعد البيانات المختلفة من ODBC,MYSQL&SQLite

ونتعرف اليوم عن ال Methods الخاصة بهم باستخدام ال Classes

1- ODBC Class

4.png

2-MySQL CLass

22.png

3-SQLite CLass

11.png

يمكنك الاطلاع علي بعض الامثلة علي استخدام قواعد البيانات باستخدام ال Classes من هنا

للاطلاع علي المقالات الاخري من هنا

تستطيع الاطلاع علي المشاريع مفتوحة المصدر من الموقع  GitHub
الموقع الرسمي للغة  http://ring-lang.net

وشكرا لكم والي اللقاء

Security and Internet Functions

تحياتي للجميع

تعرفنا علي الانواع المختلفة من قواعد البيانات في لغة البرمجة رينج Ring ونظرا لضرورة حماية تلك القواعد والبيانات المختلفة ضد الهاكرز Hackers  فسوف نتعرف سويا من خلال مقالة اليوم علي أنواع مختلفة سواء  Algorithms أو دوال تستخدم في تطبيق الحماية وذلك باستخدام  مكتبة جاهزة خاصة بال SSL في  لغة البرمجة رينج.

Ring programming language for Hashing, Encryption & Decryption

يستخدم ال SSL في لغة Ring في التشفير وكذلك فك التشفير وأيضا في ايجاد قيم ال Digests أو الرسالة الناتجة من دوال ال Hash والتي تستخدم في الحماية أو عمل خصوصية مثل خصوصية للدخول  Login أو تصريح الدخول لل  Roots ولحماية الملفات.

ملحوظة مهمة قبل البدء في موضوع ال Hashing & Encryptions

التشفير يعتبر وسيلة اخفاء المعلومات حتى لا ترى البيانات بشكل صحيح، وهو يحتاج مفتاح key أو باسورد معين أو تحتاج لطريقة معينة سرية  حتى تسترجع البيانات. بينما ال Hashing هو وسيلة لحفظ البيانات بشكل غير قابل للاسترجاع ابداً ، فالتشفير تستطيع استرجاع البيانات باستخدام الطريقة المقابلة لفك التشفير ، بينما الHashing لا يمكنك على الاطلاق.

فبالنسبة لاستخدامات ال Hashing :

  • اختبار تكامل البيانات وهذا يسمى Integrity:

مثال:

عندما تقوم بتحميل بعض البرامج من الانترنت سوف تجد بجانب زر التحميل الهاش لذلك الملف حتى بعدما تقوم بتحميله يمكنك ان تتأكد من صحة الملف وأنه وصل لك كما في الموقع عن طريق رقم الهاش الذي تم حسابه للملف.

مثال علي ذلك:

عند فتح موقع لتحميل سيرفر ما مثل هذا الموقع :

https://www.openoffice.org/download/index.html

تلاحظ اسفل التحميل التالي: Signatures and hashes: KEYS , ASC , MD5 , SHA256

نقوم بتحميل أي نوع من أنواع ال SSL  المختلفة ونقوم بفتحها عن طريق ال notepad ونقوم بمقارنة ال Strings المحملة مع الناتجة من دوال ال Hash من نفس النوع المختار من ال SSL للملف الذي قمنا بتحميلة وعند التطابق يتنبين لنا صحة الملف كما سنتعرف معا في مقالة اليوم.

ملحوظة:هناك بعض المواقع المسؤلة عن رفع الملفات واستخراج ال hashes لها وعمل مقارنة بال hashes الموجودة مع الملف قبل تنزيلة ومن أمثلة تلك المواقع الموقع التالي:http://onlinemd5.com

  • تخزين البيانات بشكل غير قابل للاسترجاع

مثال:

تخزين كلمات السر في القاعدة على شكل Hashing والسبب أنه اذا حصل اختراق للقاعدة فسوف يتم جلب كل الباسوردات بسهوله، وبالتالي اي مستخدم يسجل لديك سوف تخزن باسورده كهاش، وعندما يسجل دخول سوف تأخذ الباسورد وتحسب الهاش فاذا تطابق مع ما يوجد في القاعدة فسوف تتأكد من صحة الباسورد وبالتالي تسمح له بالدخول وسوف نتعرف علي ذلك في تطبيقات الويب.

ويمكن عن طريق مكتبة ال SSL في لغة الرينج تشفير البيانات أو كلمة السر الخاصة بالدخول أو تطبيق الخصوصية علي ملفات.

 

 

كيفية تطبيق دوال ال SSL:

1-أولا يجب عليك استدعاء مكتبة ال ssl وهي “openssllib.ring

2-ثم بعد ذلك نبدأ استخدام دوال ال SSL التالية:

 

  • MD5
  • SHA1
  • SHA256
  • SHA512
  • SHA384
  • SHA224
  • Encrypt
  • Decrypt
  • Randbytes

 

ويمكنك الاطلاع علي المفاهيم الاساسية  لتلك الدوال من هنا

كما يمكنك الاطلاع علي أمثلة توضيحية لاستخدام الدوال من الموقع الرسمي للغة

MD5() Function:

MD5(cString) ---> String contains the MD5 hash of the string cString

SHA1() Function:

SHA1(cString) ---> String contains the SHA1 hash of the string cString

SHA256() Function:

SHA256(cString) ---> String contains the SHA256 hash of the string cString

SHA512() Function:

SHA512(cString) ---> String contains the SHA512 hash of the string cString

SHA384() Function:

SHA384(cString) ---> String contains the SHA384 hash of the string cString

SHA224() Function:

SHA224(cString) ---> String contains the SHA224 hash of the string cString

Encrypt() Function:

يتم التشفير باستخدام ال Blowfish algorithm

Encrypt(cString, cKey, cIV) ---> Encrypted string

Decrypt() Function:

Decrypt(cCipher, cKey, cIV) ---> Decrypted string

Randbytes() Function:

(Randbytes(nSize) ---> String contains random bytes (bytes count = nSize

مثال توضيحي باستخدام مكتبة “OpenSSLLib”

2.jpg

الكود

ملحوظة:

تم تعريف تلك الدوال أيضا في مكتبة “stdlib.ring” عن طريق Class باسم security فمن الممكن عمل Object من Class    ال security  ثم استخدام الدوال داخل ال Object باستخدام مكتبة ال  “stdlib.ring”.

نفس المثال السابق باستخدام مكتبة “stdlib.ring”

3.PNG

الكود

 Decrypt & Encrypt

تعطي security أعلي من دوال ال hash فمثلا عند تخزين الباسورد في قاعدة البيانات يفضل تخزينة بال encrypt & decrypt & Blowfish.

مثال توضيحي:

6.jpg

 

كود1

كود2

وهناك دوال اخري تستخدم مع الانترنت وتحتاج لاستدعاء مكتبة أخري وهي: “internetlib.ring” 

"load "internetlib.ring

ثم نستخدم دوال الانترنت التالية:

  • Download
  • SendEmail

download() Function

عند عمل Download نكون متصلين بالانترنت وعن طريقها يمكن قراءة أي موقع وعمل أي processing.

Download(cURL) ---> String contains the server response

SendEmail() Function

(SendEmail(cSMTPServer,cEmail,cPassword,cSender,cReceiver,cCC,cTitle,cContent

مثال توضيحي:

11.PNG

الكود

 

وأيضايمكن استدعاء مكتبة “stdlib.ring”  واستخدام تلك الدوال داخل Object من Class باسم “internet”. كما في هذا المثال:

33.PNG

الكود

مثال اخر علي استخدام دوال ال ssl بمكتبة ال STDLIB:

capture3.jpg

للاطلاع علي المقالات الاخري من هنا

تستطيع الاطلاع علي المشاريع مفتوحة المصدر من الموقع  GitHub
الموقع الرسمي للغة  http://ring-lang.net

والي اللقاء

SQLite Functions

بسم الله الرحمن الرحيم

أما بعد فمقالة اليوم استكمالا لشرح قواعد البيانات في  لغة البرمجة رينج Ring.

تحدثنا في اخر مقالتين عن نوعين من قواعد البيانات وهما  ODBC ,MYSQL  والمسؤلين عن الاتصال بقواعد البيانات وتطبيق أوامر ال SQL المختلفة من اضافة،حذف،تعديل،بحث،…الخ.تعرفنا علي الدوال الخاصة بهم . ومقالة اليوم تتحدث عن دوال قاعدة البيانات SQLite.

كيفية التعامل مع قواعد البيانات SQLite في لغة Ring؟

سنقوم بنفس الخطوات التي طبقناها علي MYSQL  ، ODBC وهي كالتالي:

1.نقوم باستدعاء مكتبة SQLite وهي SQLitelib.ring 

"load "sqlitelib.ring

2.ثم نقوم بتهيئة الاتصال بقاعدة البيانات عن طريق الدالة ()SQLite_Init

sqlite_init() ---> SQLite Object

3.بعد ذلك  نفتح الاتصال عن طريق الدالة ()SQLite_Open ونقوم بتعريف ملف ال Database  الذي تم انشاؤه وفي حالة عدم وجوده يتم انشاؤه تلقائيا.

(sqlite_open(SQLite Object,cFileName

4.ثم نقوم بادارة قاعدة البيانات بأوامر ال SQL المختلفة عن طريق الدالة ()SQLite_Execute

(sqlite_exexute(SQLite Object,cSQLStatement

من خلال الموقع الرسمي ل SQLite  تستطيع الاطلاع علي أوامر ال SQL وال Syntax ل SQLite.

5. يمكن معرفة الخطأ في الاتصال أو جمل ال SQL عن طريق الدالة ()SQLite_errmsg

(sqlite_errmsg(SQLite Object

6.وفي النهاية نقوم باغلاق الاتصال بالقاعدة عن طريق الدالة ()SQLite_Close

(sqlite_close(SQLite Object

ملحوظة:

ال SQLite لا يحتاج الي Server وبالتالي يتم التنفيذ تلقائيا من خلال تضمين ملف ال SQLite في التطبيق.

مثال توضيحي:

1.jpg

الكود

وبذلك نكون قد انتهينا من شرح ال Database في لغة البرمجة رينج والي اللقاء.

للاطلاع علي المقالات الاخري من هنا

تستطيع الاطلاع علي المشاريع مفتوحة المصدر من الموقع  GitHub
الموقع الرسمي للغة  http://ring-lang.net

 

 

 

 

MySQL Functions

بسم الله الرحمن الرحيم

أما بعد فحديثنا اليوم هو استكمالا لشرح قواعد البيانات في لغة البرمجة رينج Ring ، تحدثنا في المقالة السابقة عن ال odbc واليوم نتحدث  علي دوال MySQL في لغة ال RING.

ويمكنك الاطلاع علي أهم أوامر ال SQL وكيفية تنفيذها علي MySQL من هنا

دوال ال MYSQL داخل لغة Ring

()MySQL_Info

لمعرفة ال version  لبرنامج ال MYSQL

()MySQL_Init

لعمل handle أو تهيئة الاتصال بالسيرفر MYSQL

(MySQL_Error(mysql handle

لمعرفة الخطأ الناتج من ال MYSQL أو جمل ال SQL

MySQL_Connect(MySQL Handle, cServer,  cUserName, cPassword

لعمل اتصال بقاعدة البيانات MYSQL

()MySQL_Close

لاغلاق الاتصال بقاعدة البيانات MYSQL

(MySQL_Query(MySQL Handle, cSQLQuery

لتنفيذ أوامر ال SQL

()MySQL_Insert_ID

للحصول علي عدد الصفوف التي تم عمل insert  لها

()MySQL_Result

للحصول علي ناتج ال query بدون اسماء الاعمدة   ويستخدم مع الامر select “يعرض القيمة فقط”

()MySQL_Next_Result

للانتقال الي الجملة التالية في ال query ” تستخدم في حالة وجود أكثر من جملة في ال query الواحدة”

()MySQL_Columns

للحصول علي اسماء الاعمدة ويستخدم مع الامر select

()MySQL_Result2

للحصول علي ناتج ال query مع اسماء الاعمدة  ويستخدم مع الامر select “يعرض أولا جميع أسماء الاعمدة ثم جميع القيم”

(MySQL_Escape_String(mysql handle,cString

تعمل علي معالجة البيانات ال Binary قبل حفظها في DB

(MySQL_AutoCommit(mysql handle,Status

تعمل علي  فتح واغلاق خاصية ال autocommit

(MySQL_Commit(mysql handle

لعمل Commit وحفظ التعديلات علي ال DB

(MySQL_Rollback(mysql handle

لعمل استعادة  Restoreلل DB

 

ينبغي قبل استخدام أي دالة تحميل مكتبة ال mysqllib.ring التي تحمل دوال ال MYSQL: 

"Load "mysqllib.ring

كيفية التعامل مع قواعد البيانات  MYSQLفي لغة Ring؟

1-نقوم باستدعاء مكتبة MYSQL  وهي mysqllib.ring.

2-نقوم بتهيئة الاتصال بقاعدة البيانات عن طريق الدالة ()MySQL_Init.

3-ثم نقوم بعمل الاتصال عن طريق الدالة MySQL_Connect ونقوم بتعريف التالي:

  • ال server أو ip الخاص بالاتصال بال Server.
  • واسم المستخدم الذي تم ادخاله عند تسطيب MYSQL.
  • والباسورد الذي تم ادخاله عند تسطيب MYSQL.
  • نقوم بانشاء قاعدة بيانات عن طريق الامر Create database db_name.
  • نقوم باستخدام قاعدة البيانات التي نعمل عليها عن طريق الامر use  db_name.

4–ثم نقوم بانشاء الجداول والتعامل معها بأوامر ال SQL المختلفة.

مثال توضيحي  علي كيفية الاتصال بقاعدة البيانات:

3.jpg

الكود

 

مثال توضيحي علي انشاء جدول داخل قاعدة البيانات:3.PNG

الكود

4.png

مثال أخر:

4.jpg

الكود

مثال توضيحي علي كيفية تنفيذ أكثر من جملة في نفس ال Query باستخدام الدالتين:

(mysql_result(con
(mysql_next_result(con

 

show result of sql_statements without columns#
"load "mysqllib.ring
()con= MySQL_Init
see mysql_connect(con,'localhost','root','root')+nl
('mysql_query(con,'use ringmysql
 ;  we separate the statements by #
('mysql_query(con,'select name from characters where id=3;'+'select name from characters where id=2
show the result of first statement#
(See mysql_result(con
move to the next statement#
(mysql_next_result(con
show the result of second statement#
(see mysql_result(con
see mysql_close(con)+nl

الكود

 مثال اخر:

show result of sql_statements with columns names in first, before values#
"load "mysqllib.ring
()con= MySQL_Init
mysql_connect(con,'localhost','root','root')+nl
('mysql_query(con,'use ringmysql
('mysql_query(con,'select * from plan
result2 show the columns elements  with values#
(see mysql_result2(con
(mysql_close(con

الكود

مثال توضيحي علي ال Commit , RollBack:

8.jpg

الكود

ملحوظة:

خاصية ال commit  تعمل عمل ال Save عند تنفيذ أوامر ال SQL بنجاح.

MySQL_Escape_String() Function

تعمل علي المعالجة أولا ثم التخزين في صورة حرفية. مثل معالجة الحروف الخاصة والصور.

MySQL_Escape_String(MySQL Handle, cString) ---> String after processing

Save Image inside the database

11.jpg

الكود

Restore Image From The Database

2.jpg

الكود

للاطلاع علي المقالات الاخري من هنا

تستطيع الاطلاع علي المشاريع مفتوحة المصدر من الموقع  GitHub
الموقع الرسمي للغة  http://ring-lang.net

وشكرا لكم والي اللقاء

 

ODBC Functions

مرحبا بكم جميعا

لغة رينج هي اللغة التي قام بابتكارها مبرمج عربي ووصلت الي الترتيب ال 45 بين لغات البرمجة الاخري، وقمنا بعمل مقالات في شرح اللغة و تحدثنا عن أساسيات لغة البرمجة رينج وسوف ننطلق الي شرح قواعد البيانات في اللغة حيث لغة البرمجة Ring تدخل في برمجة قواعد البيانات ولا يخفي علينا اهمية قواعد البيانات ونظرا لان اللغة وصلت لدرجة عالية من المميزات فلا شك أنها تدخل في برمجة قواعد البيانات وبرمجة الالعاب وبرمجة تطبيقات الويب…الخ.

فلا يمكن الاستغناء عن قواعد البيانات حيث تدخل في المشاريع الكبيرة لتطبيقات الويب التي تحتفظ بالبيانات وتديرها بطريقة مستمرة مثل تطبيق ال Facebook,Twitter,LinkedIn,Youtube، وكذلك المشاريع الخاصة بحياتنا اليومية مثل مشروع ادارة مدرسة يدير جدول المدرسين والطلبة وحضورهم وعددهم،ومشروع الصيدلية لادارة الادوية، ومشروع الطائرات والتحكم في ساعات الهبوط والنزول،ومشروع ادارة المبيعات والتحكم في البضائع وحركات البيع والشراء،ومشروع البنك لحفظ بيانات الشخص ومستحقاته، ….الخ.

ونتحدث في مقالتنا اليوم عن مكتبة خاصة بقواعد البيانات في لغة البرمجة Ring وهي مكتبة دوال ال  ODBC ،وهي المسؤولة عن فتح ومعالجة قواعد البيانات المختلفة.

وفيما يلي دوال ال ODBCفي لغة Ring:

odbc_init() —> ODBC Handle

 لتهيئة الاتصال بقاعدة البيانات

odbc_drivers(ODBC Handle) —> Drivers

للحصول على ال drivers

odbc_datasources(ODBC Handle) —> Data sources

للحصول على ال drivers من  ال datasource

(odbc_close(ODBC Handle

لااغلاق ال resources بعد استدعاء الدوال

(odbc_connect(ODBC Handle, cConnectionString

لعمل اتصال بقاعدة البيانات

(odbc_disconnect(ODBC Handle

لقطع الاتصال بقاعدة البيانات

(odbc_execute(ODBC Handle, cSQLStatement

لتنفيذ جمل ال SQL على قاعدة البيانات

odbc_colcount(ODBCHandle)—>ColumnsCount

للحصول على عدد الاعمدة في ال query او جدول الاستعلام.

(odbc_fetch(ODBC Handle

للتطبيق على الصفوف في ال query

(odbc_getdata(ODBCHandle,nColumnNumber

للحصول على ال data في الاعمدة

(odbc_tables(ODBC Handle

للحصول على الجداول في قاعدة البيانات

(odbc_columns(ODBC Handle, cTableName

للحصول على أعمدة داخل جدول أو DB

(odbc_autocommit(ODBC Handle, lStatus 

لفتح أو اغلاق خاصية ال autocommit

(odbc_commit(ODBC Handle

لعمل Commit لل Updates في DB

(odbc_rollback(ODBC Handle

لعمل restore  لل Updatedفي DB

ملحوظة:

ال Transaction عبارة عن مجموعة من ال actions لمعالجة ونقل قواعد البيانات من مكان لأخر بنجاح وأثناء ذلك قد يحدث فشل أثناء النقل.

حالات ال Transactions:

  • Active: المرحلة الاولي أثناء التنفيذ.
  • Partially Committed: يكون بعد اخر جملة SQL تم تنفيذها.
  • Committed: عند نجاح التنفيذ.
  • Failed: عند عدم نجاح التنفيذ.
  • Aborted/rolledback: في هذه المرحلة تستعيد قاعدة البيانات حالتها مرة أخري بدلا من بدء ال transaction من جديد.

أي أن ال Commition هي المرحلة النهائية بعد وصول قاعدة البيانات بنجاح وبالتالي عند عمل Commit يعني تسجيل الناتج بعد أخر Commit أي تعمل عمل ال “Save“، وعند عمل rollback يعني استعادة الحالة من جديد بعد اخر Commit أي يتم تنفيذ وتسجيل الناتج لخطوات التنفيذ بعد ال rollback

  • في حالة أن Autocommit =0  يتم تجاهل  المراحل التي لم يتم تسجيل ال Commit فيها وتنفيذ مراحل ال Rollback.
  • وفي حالة أن Autocommit =1 يتم تنفيذ جميع المراحل قبل وبعد ال Commit لان خاصية ال commit مفعلة تلقائيا وان لم يتم تسجيلها وكذلك يتم فيها تنفيذ مراحل ال Rollback.

    وقبل استخدام أي دالة ينبغي تعريف مكتبة ال ODBC كالتالي:

    "Load "odbclib.ring
     Use ODBC functions#

مثال توضيحي على استدعاء دوال مكتبة ال ODBC ثم طباعة ال Drivers:

4.jpgالكود

ويمكن رؤيتها في الويندوز عن طريق اتباع الخطوات التالية:

Control panal-Administrative Tools-ODBC data sources

5.jpg

كيفية الاتصال بقاعدة البيانات:

1-أولا يجب عليك عمل قاعدة بيانات وأبسط قاعدة بيانات تكون ب Microsoft Access

ويوجد شروحات كثيرة علي ال Web لشرح الجداول علي  Microsoft Access وقواعد البيانات وال SQL.

2-بعد عمل الجدول نضعه مع ملف ال Source.

3-نقوم باستدعاء مكتبة ال ODBC وهي “odbclib.ring”.

4-نقوم بتهيئة الاتصال بقاعدة البيانات عن طريق الدالة ()odbc_init.

5-ثم نقوم بالاتصال بقاعدة البيانات التي أنشأناها بال microsoft access عن طريق الدالة ()odbc_connect ونقوم بتعريف اسم قاعدة البيانات وال driver المسؤل عن فتحة.

6-ثم بعد ذلك يمكن لنا ادارة قاعدة البيانات بأوامر ال SQL المختلفة من اضافة وتعديل وحذف و…الخ. وذلك عن طريق الدالة ()odbc_execute ونستطيع كذلك بعد ذلك استخدام باقي دوال ال ODBC التي ذكرناها في الجدول حسب ما يريد المستخدم.

7-في النهاية نقوم بغلق الاتصال بقاعدة البيانات عن طريق الدالة ()odbc_disconnect.

مثال توضيحي:

connection#
"load "odbclib.ring
()oOdbc=odbc_init
("{(see odbc_connect(oOdbc,"DBQ=data.mdb;Driver={Microsoft Access Driver (*.mdb  
(odbc_disconnect(oOdbc
(odbc_close(oOdbc

الكود

في المثال التالي يوجد جدول باسم data.mdb.

6.jpg

مثال توضيحي علي كيفية الحصول على البيانات داخل الاعمدة:

صورة توضيحية للداتا بيز أو الجدول داخل برنامج Microsoft Access:

1.jpg

2.jpg الكود

مثال 2:

fetch query and get the tables#
 at this moment I have 2 tables,customer and clients in the data DB#
"load "odbclib.ring
()oOdbc=odbc_init
("{(odbc_connect(oOdbc,"DBQ=data.mdb;Driver={Microsoft Access Driver (*.mdb
see odbc_tables(oOdbc) + nl
(while odbc_fetch(oOdbc
see odbc_getdata(oODBC,3)+nl  
end
(odbc_disconnect(oOdbc
(odbc_close(oOdbc

الكود

مثال3:

fetch query and get the columns of table#
"load "odbclib.ring
()oOdbc=odbc_init
("{(odbc_connect(oOdbc,"DBQ=data.mdb;Driver={Microsoft Access Driver (*.mdb
odbc_columns(oOdbc,"clients")+nl
(while odbc_fetch(oOdbc
get the data in the fourth columns from clients table#
see odbc_getdata(oODBC,4)+nl   
end
(odbc_disconnect(oOdbc
(odbc_close(oOdbc

الكود

مثال توضيحي على ال Commition and rolledback:

في هذا المثال سوف نتعامل مع جدول ال Clients وهو  فارغ كما في الشكل التالي:

2.jpg

وجمل ال SQL في البرنامج كما هو موضح بالشكل:

4.jpg الكود

وهنا الناتج في ال  DBبعد عمل Run للبرنامج:

Capture.PNG

Save and Restore images

كما يمكن تخزين الصور داخل قاعدة البيانات ولكن يشغل حيز كبير في ال DB

ويتم ذلك عن طريق تحويل الصور الي ال Hexadecimal

  • يتم تخزين الصورة في قاعدة البيانات عن طريق الامر Read
  • ويتم نسخ نفس الصورة بالقيمة ال Hexadecimal المخزنة في قاعدة البيانات ثم تحويلها مرة أخري الي String عن طريق الامر Write

 

9.jpg

الكود

وهذا ما تم تخزينة في قاعدة البيانات:

11.PNG

 

ثم بعد ذلك يمكننا استرجاع الصورة من DB عن طريق التحويل مرة أخري ل String

restore image#
odbc_execute(pODBC,"select value from tel where id = 2 ") + nl
(odbc_fetch(pODBC
( ( (write("great.jpg",hex2str( odbc_getdata(pODBC,1

55.jpg

الكود

ملحوظة:

  • ينبغي تخزين اسم  الصورة في عمود باسم name وقيمة ال hexadecimal في عمود باسم value
  • ينبغي اختيار نوع العمود الذي يتم فيه تخزين الصورة من النوع long text نظرا لكبر حجم الصور.

ومن هنا صور توضيحية لذلك

وهنا قد انتهينا من مقالة اليوم والي لقاء اخر.

للاطلاع علي المقالات الاخري من هنا

تستطيع الاطلاع علي المشاريع مفتوحة المصدر من الموقع  GitHub
الموقع الرسمي للغة  http://ring-lang.net

 

Using the Natural Library

أهلا ومرحبا بكم جميعا

نكمل كلامنا عن البرمجة الطبيعية بلغة رينج Ring أي الخاتم Ring الذي يرتبط اختياره واستخدامه بالمستخدم نفسه.فالبرمجة بلغة المستخدم هي التي تجعله يقوم بالبرمجة بكامل الحرية دون قيود ال Syntax  وهي التي تسهل عليه المفاهيم البرمجية وليس حفظ ال Syntax.

تحدثنا في المقالة السابقة عن البرمجة الطبيعية Natural programming وتعرفنا على المقدرة التي أعطتها اللغة Ring للمبرمج للتحكم في البرمجة، حيث يقوم بكتابة ما يشاء وبدون ان يؤثر ذلك على سرعة التنفيذ.واليوم نتعرف علي  مكتبة لتلك اللغة  ال Natural لتسهل علينا طريق البرمجة أكثر وأكثر.

مثال توضيحي علي ما سوف نقوم بتنفيذه

3.jpg


Using the Natural Library

بعد تحميل اللغة “اخر اصدار” من موقع اللغة

يمكنك الاطلاع على المكتبة “naturallib.ring” الخاصة ب Natural Language Programming  من المسار التالي: Ring_1.5.4_All_Platforms\ring\ringlibs\naturallib

وتحتوي المكتبة naturallib.ring على ثلاث مكتبات:

  • naturalbase.ring
  • naturallanguage.ring
  • naturalcommand.ring
  1. أولا المكتبة natural base. Ring

تحتوي methods خاصة بال expressions وال commands.

  1. ثانيا المكتبة NaturalCommand.ring

تحتوي على ال DefineNaturalCommand” Object”  لتحديد نوع ال syntax الخاص بال Commands.

الأنواع المختلفة لل Syntax:

1.jpg

3.ثالثا المكتبة naturallanguage.ring

تحتوي على Class باسم NaturalLanguage وMethods تستخدم في المشروع التنفيذي وسوف نتعرف بالتفصيل علي كيفية استخدام تلك ال Methods.

الجدول التالي يوضح ال methods الموجودة في المكتبة:

2.jpg


خطوات عمل مشروع ب Natural Language مع استخدام مكتبة ال Natural؟

1نقوم بتعريف المكتبة  عن طريق الامر Load واسم المكتبة.

"Load "naturallib.ring

2-نقوم بعمل ملف تنفيذي يتم فيه تعريف المكتبة وObject من ال Class باسم NaturalLanguage

يتم فيه تعريف ما ذكرناه من ال Methods التالية:

  • (SetLanguageName(cLanguageName
  • (setCommandsPath(cFolder
  • (SetPackageName(cPackageName
  • (UseCommand(cCommandName
  • (SetOperators(cOperators
  • (RunFile(cFileName
  • (RunString(cString

ملحوظة:

  • نستخدم ال RunFile(cFileName) method  عند كتابة الكود داخل ملف نصي”txt.”
  • نستخدم ال Runstring (” “) method  لتنفيذ الكود من داخل سلسلة حرفية. ويختلف ما يكتب بداخلها باختلاف ال Syntax المستخدم.

3-نقوم بعمل ملف يتم فيه تعريف ال Commands أو ال Keywords.

بعد عمل الملف الخاص بال Commands نقوم بتعريف ال DefineNaturalCommand” Object” ونستخدم ال method الذي يحدد نوع ال Syntax الخاص بل Commands أو ال Keywords كما سنري في الامثلة.

ويكون التعريف كالتالي:

DefineNaturalCommand.Syntax_Type

وبداخل هذا ال method يتم فيه تعريف ثلاث parameters:

Package Name: بنفس الاسم الذي تم كتابته في الملف التنفيذي.

Keyword/Command: نكتب الكلمة أو الامر ويكون بنفس اسم ملف ال Command.

Anonymous Function: نكتب فيه الكود الذي نريد تنفيذه.

ملحوظة:

  • ()Expr: تستخدم للوصول الي القيمة بعد ال Command.
  • (Expr (1: يعني الوصول المباشر الي ال expression الأول  بعد ال Command.
  • (Expr (2: يعني الوصول المباشر الي ال expression الثاني بعد ال Command.

ملاحظات مهمة قبل البدء في الأمثلة التوضيحية:

1-عند كتابة الامر بداخل UseCommand يجب أن يكون الاسم بنفس اسم ملف ال Command.

2-تحديد اسم ال Syntax هو ما يترتب عليه ما يتم تعريفه داخل ال ()Runstring وكذلك ما نريد تنفيذه من Numbers وStringsو Expressions.

3-الفرق بين اختيار ال Syntax يكون Keyword أو Command هو عدد كلمات ال Command

  • فاذا كان كلمة واحدة نستخدم ال syntax الخاص ب Keyword.
  • وإذا كان مجموعة كلمات لابد أن نستخدم ال syntaxالخاص ب Command.

4بالنسبة لل Keywords وليس ال Commands:

  • يجب تسمية الملف  باسم ال Keyword.
  • فاذا كان ال Syntax هو Keyword فقط نكتب اسم ال Keyword فقط داخل ال RunString
  • واذا كان ال Syntax هو Number يتم تعريف قيمة افتراضية رقمية بداخلة وليكن 0.
  • وإذا كان ال Syntax هو Number Number يتم تعريف قيمتين افتراضيتين رقميتين بداخل ال Method وليكن 0 0.
  • وإذا كان ال Syntax هو String يتم تعريف قيمة افتراضية حرفية بداخلة وليكن ` `.
  • وإذا كان ال Syntax هو String String يتم تعريف قيمتين افتراضيتين حرفيتين وليكن “ “

5بالنسبة لل Commands وليس ال Keywords:

  • يجب تسمية الملف  باسم ال Command.
  • إذا كان ال Syntax عبارة عن Command فقط فيكتب داخل Runstring ال Command فقط.

وإذا كان ال Syntax عبارة عن Commandstring فيكتب داخل Runstring ال Command وقيمة ال ال expression بناء علي نوعه.

6-ال Expression يجمع بين ال number/string:

  • فاذا تم تعريف ال  commandexpression” Syntax”  ، يعرض فقط expression واحد فقط بعد ال Command قد يكون حرفي أو رقمي. عن طريق (expr(1.
  • واذا تم تعريف ال  commandexpressionexpression” Syntax”، يعرض اثنين من ال expressions قد يكون حرفي أو رقمي. عن طريق (expr(1) expr(2.

7-ال Literal هو ما يكتب بعد النقتطين : ويكون عبارة عن كلمة واحدة أو لايحتوي علي مسافات.

8-يمكنك الفتح والتنقل للملفات بسهولة ويشكل سريع من خلال مستعرض ملفات المشروع project File في الجزء الايسر لمحرر الكود Code Editor الخاص باللغة.


الخطوات العملية:

نقوم بعمل عمل فولدر للمشروع في أي مكان على الجهاز.

وفي حالة انشاء ملف ال Commands في نفس مكان ال Source أو مع ملف ال Execution

فعندها يكون المسار في ال  SetCommandsPath” method” كالتالي:

 (()SetCommandsPath (CurrentDir 

أو كتابة المسار كاملا لمكان تواجد ال Command كالتالي:

("setCommandsPath("C:\Test\NaturalLibrary\Command

 أولا تنفيذ الأوامر عن طريق Runstring:

أمثلة توضيحية علي ال Commands:

مثال1 علي commands:

the syntax is command only#
the execution fileو"file name"mylanguage.ring#
"load "naturallib.ring
}MyLanguage = New NaturalLanguage
(SetLanguageName(:MyLanguage
(()setCommandsPath(CurrentDir
("SetPackageName("MyLanguage.Natural
("UseCommand("thenameis
(  "runstring( " the name is
{

the command file#
"the file name is "thenameis.ring#
])DefineNaturalCommand.SyntaxIscommand
,"Package = "MyLanguage.Natural:
,"command = "the name is:
}Function = func:
see "Hello"+nl+'tell me the name of this language'+nl                
Give name                
'see name+'!'+" "+'it is a beautiful language                
{            
([

الكود

مثال2 commandstring:

"the execution file name"mylanguage.ring#
"load "naturallib.ring
}MyLanguage = New NaturalLanguage
(SetLanguageName(:MyLanguage
(()setCommandsPath(CurrentDir
("SetPackageName("MyLanguage.Natural
("UseCommand("thenameis
(" 'runstring( " the name is 'Ring
{
"the file name is "thenameis.ring#
])DefineNaturalCommand.SyntaxIscommandstring
,"Package = "MyLanguage.Natural:
,"command = "the name is:
}Function = func:
(see " The name of this language is "+expr (1                  
{            
 ([

الكود

مثال3 commandstring:

the syntax is command string#
"load "naturallib.ring
}MyLanguage = New NaturalLanguage
(SetLanguageName(:MyLanguage
(()setCommandsPath(CurrentDir
("SetPackageName("MyLanguage.Natural
("UseCommand("thenameis
( " 'runstring( " the name is 'ring programming language
{
])DefineNaturalCommand.SyntaxIscommandstring
,"Package = "MyLanguage.Natural:
,"command = "the name is:
}Function = func:
(see expr(1                   
{            
([

الكود

مثال4 commandstringstring:

the syntax is command string string#
"load "naturallib.ring
}MyLanguage = New NaturalLanguage
(SetLanguageName(:MyLanguage
(()setCommandsPath(CurrentDir
("SetPackageName("MyLanguage.Natural
("UseCommand("TheNameIs
(" 'runstring( " The Name Is 'ring' 'and it is creadted in 2016 and we wish to be no. 1
{
])DefineNaturalCommand.SyntaxIscommandstringstring
,"Package = "MyLanguage.Natural:
,"command = "the name is:
}Function = func:
see "you will see the expression no. 1 in the execution file"+nl           
see" the name of this lang. is "+ expr(1)+nl           
see "and after that i show the expression no. 2 in the execution file"+nl  
(see expr(2           
{            
([

الكود

مثال5 Command Number:

the syntax is command number#
 see i put a numeric value'0' after command #
"load "naturallib.ring
}MyLanguage = New NaturalLanguage
(SetLanguageName(:MyLanguage
(()setCommandsPath(CurrentDir
("SetPackageName("MyLanguage.Natural
("UseCommand("thenameis
(" runstring( " the name is 0
{
])DefineNaturalCommand.SyntaxIscommandnumber
"Package = "MyLanguage.Natural:
"command = "the name is:
}Function = func:
see "Hello"+nl+'tell me the name of this language'+nl                  
Give name                  
'.see name+'!'+" "+'it is a beautiful language'+nl+'I see it need to be the era lang
{            
  ([

الكود


the syntax is command number#
"load "naturallib.ring
}MyLanguage = New NaturalLanguage
("SetLanguageName(:MyLanguage
(()setCommandsPath(CurrentDir
("SetPackageName("MyLanguage.Natural
("UseCommand("thenameis
("runstring( " the name is 1
{
])DefineNaturalCommand.SyntaxIscommandnumber
,"Package = "MyLanguage.Natural:
,"command = "the name is:
}Function = func:
see "Hello"+nl+'tell me the name of this language'+nl                    
Give name                     
"'.see name+'!'+" "+'it is a beautiful language'+nl+'I see it need to be the era lang                                      
'and number '+expr(1)+' rather than others'+
{
([

الكود

مثال6 Command NumberNumber:

the syntax is command number number#
take the numbers after command and ignore the other keywords#
"load "naturallib.ring
}MyLanguage = New NaturalLanguage
(SetLanguageName(:MyLanguage
(()setCommandsPath(CurrentDir
("SetPackageName("MyLanguage.Natural
("UseCommand("TheNameIs
("runstring( " The Name Is ring and it is creadted in 2016 and we wish to be no. 1
{
])DefineNaturalCommand.SyntaxIscommandnumbernumber
,"Package = "MyLanguage.Natural:
,"command = "the name is:
}Function = func:
see "you will see the expression no. 1 in the execution file"+nl
see" the date of birth of this lang. is "+ expr(1)+nl
see "and after that i show the expression no. 2 in the execution file"+nl
(see"the Ring lang. now one of the 100 top languages and we wish to be no. "+expr(2
{
([

الكود

مثال7 Command expression:

"load "naturallib.ring
}MyLanguage = New NaturalLanguage
(SetLanguageName(:MyLanguage
(()setCommandsPath(CurrentDir
("SetPackageName("MyLanguage.Natural
("UseCommand("TheNameIs
("runstring( "The Name Is 'Ring' and we wish to be no. 1
{
])DefineNaturalCommand.SyntaxIscommandexpression
,"Package = "MyLanguage.Natural:
,"command = "the name is:
}Function = func:
(see " the name of this lang. is "+expr(1
{
([

الكود

مثال 8 command expression expression:

the syntax is command expressionexpression#
"load "naturallib.ring
}MyLanguage = New NaturalLanguage
(SetLanguageName(:MyLanguage
(()setCommandsPath(CurrentDir
("SetPackageName("MyLanguage.Natural
("UseCommand("TheNameIs
("runstring( " The Name Is 'Ring' and we wish to be no. 1
{
])DefineNaturalCommand.SyntaxIscommandexpressionexpression
,"Package = "MyLanguage.Natural:
,"command = "the name is:
}Function = func:
(see " the name of this lang. is "+expr(1)+' and will be '+expr(2          
{            
([

الكود

أمثلة توضيحية علي ال Keywords:

مثال1 Syntax is Keyword:

Syntax is Keyword without expr#
"file name is "mylanguage.ring#
"load "stdlib.ring
"load "naturallib.ring
}MyLanguage = New NaturalLanguage
(SetLanguageName(:MyLanguage
(()setCommandsPath(CurrentDir
("SetPackageName("MyLanguage.Natural
(UseCommand(:Show
(" runstring(" Show
{
"file name is "shaow.ring#
})DefineNaturalCommand.SyntaxIskeyword
,"Package = "MyLanguage.Natural:
,"keyword = "show:
}Function = func:
[]=alist                   
}for y =1 to 10                   
alist+y                        
{                   
see alist                   
{             
([

الكود

مثال2 Syntax is Keyword string:

Syntax is Keyword string with space only in string value#
"load "stdlib.ring
"load "naturallib.ring
}MyLanguage = New NaturalLanguage
(SetLanguageName(:MyLanguage
(()setCommandsPath(CurrentDir
("SetPackageName("MyLanguage.Natural
the name of the file#
("UseCommand("show
space ' ' ,as value for string#
(" ' 'runstring("show
{
])DefineNaturalCommand.SyntaxIskeywordstring
,"Package = "MyLanguage.Natural:
,"keyword = "show:
}Function = func:
[]=alist                     
}for y =1 to 10                     
alist+y                          
{                      
see alist                     
{             
([

الكود

مثال3:

Syntax is Keyword string with string values#
Syntax is Keyword string#
"load "stdlib.ring
"load "naturallib.ring
}MyLanguage = New NaturalLanguage
(SetLanguageName(:MyLanguage
(()setCommandsPath(CurrentDir
("SetPackageName("MyLanguage.Natural
("UseCommand("show
(" ':runstring("show 'the numbers in alist
{
])DefineNaturalCommand.SyntaxIskeywordstring
,"Package = "MyLanguage.Natural:
,"keyword = "show:
}Function = func:
[]=alist                   
}for y =1 to 10                   
alist+y                       
{                   
see expr(1)+nl see alist                  
{             
([

الكود

ثانيا تنفيذ الأوامر عن طريق Runfile:

مثال توضيحي:

 text Files#

hello
'I say 'hello' to 'machine
I want a program  to execute a division operation
of two numbers 1000 and 5 then add each result with 3000
'thanks 'ok thanks
"file name "mylanguage.ring#
"load "stdlib.ring
"load "naturallib.ring
}MyLanguage = New NaturalLanguage
(SetLanguageName(:MyLanguage
("setCommandsPath("C:\Test\NaturalLibrary\Command
("SetPackageName("MyLanguage.Natural
 "for file and command"hello.ring#
("UseCommand("hello
 "for file and command"numbers.ring#
("UseCommand("numbers
("runfile("file.txt
{
"file name"hello.ring#
take the two expr after the keyword hello#
])DefineNaturalCommand.SyntaxIskeywordexpressionexpression
,"Package = "MyLanguage.Natural:
,"keyword = "hello:
}Function = func:
see expr(1)+" " +expr(2)+nl                    
{            
([
"file name"numbers.ring#
take the two expr after the keyword numbers#
])DefineNaturalCommand.SyntaxIskeywordexpressionexpression
,"Package = "MyLanguage.Natural:
,"keyword = "numbers:
}Function = func:
(division_result=expr(1)/expr(2                     
see "result1=" + division_result+nl                     
{             
([

الكود

ملحوظة:

  • يمكن أخذ أي command او keyword من ملف نصي “txt.”شرط وجوده أولا في الملف التنفيذي الذي يحتوي على UseCommand  وبعد تنفيذه من خلال Runfile ، يمكن إضافة بعض الخصائص الأخرى على ال Command مع الكود الموجود في الملف وذلك من خلال تنفيذه في ملف اخر.
"Load"executionFile
()objectNameInExecutionFile.RunString
 }()objectNameInExecutionFile {RunString

مثال توضيحي:

"file name "exefile2.ring#
"load"mylanguage.ring
")Mylanguage.runstring
 "will execute the the file"mylanguage.ring" then two expressions in the code of files  "numbers and hello#
numbers 100 25
numbers 10 2
numbers 4 2
hello 'welcome' ' '
("

الكود

ويمكن أضافة بعض ال Operators في كتابة الكود مع تجاهل وجودها حتى لا تؤثر على ال Syntax

من خلال ال SetOperators()  :Method

أمثلة على ال Operators:    (“() & $ @ >> +:”)

مثال توضيحي:

"file name "exefile2.ring#
SetOperators#
"load"mylanguage.ring
}Mylanguage
(" () , @ & ")SetOperators
")runstring
(numbers (100, 25
(numbers (10 ,2&
(numbers (4 ,2&
''  @   'ends with hello @'welcome&
("
{

الكود

Defining commands using classes

في  كثير من الاحيان نحتاج الي أن نستخدم ال Class حتى يتسنى لنا استخدام ال Functions أو Methods كما نريد ويمكن أن نستخدمها لتعطي نفس النتيجة بالطريقة الاولي ولكنها تفصيلية أكثر من الاولي.

هي نفس طريقة سريان الكود كما ذكرناه في المقالة السابقة ولكن نستخدم فيها مكتبة ال Natural لتسهل علينا الكتابة ويجب أن نلتزم بال Methods الموجودة في المكتبة. ولكن كما قلنا إن اللغة لا تقيدك أبدا فاللغة Open Source وتسمح لك بإمكانية التطوير في المكتبات.

يمكنك أن تفتح المكتبة كما وضحنا في بداية المقالة وتطلع على ال Methods ومن أهمها ما يوضحه الجدول التالي:

1.JPG

الخطوات

  • نستخدم ال Package المعرفة في ملف التنفيذي ثم نعرف Class باسم ال Command و نضيف attribute باسمه

والطريقة المستخدمة في المكتبة تكون كالتالي:

func AddAttributes_CommandName
("AddAttribute(self,"CommandName
  • نعرف ال CommandData في دالة ال getter
Func getCommandName
()StartCommand 
"CommandData () [: name] = "CommandName           
CommandData () [: nExpr] = 0
[]=[CommandData () [: aExpr
  • ثم نستخدم دالة ال braceexpreval للحصول على عدد معين من ال expressions.

ولتعريف دالة ال braceexpreval مع المكتبة تكون كالتالي:

func BraceExprEval_CommandName nValue
search for command with the name of the class and attribute name#
}If isCommand () and CommandData () [: name] =: CommandName
test if expression is number or not#
}(If isNumber (nValue
2_remain storing expressions in list to allow using them untill expr#
++[CommandData () [: nExpr
CommandData () [: aExpr] + nValue
}If CommandData () [: nExpr] = 2
()functionNameOfCodeExecution

استخدمت   هنا 2expressions فقط ويمكن استخدام أكثر من اثنين كما سنوضح في الأمثلة:

ملحوظة:

ينبغي مراعاة {اسم ال Command و _} عند تعريف ال methods وال attributes لتكون بنفس اسم تعريفها في المكتبة  مثل:

BraceExprEval_CommandName
AddAttributes_CommandName

أمثلة توضيحية:

Commands with class and functions#
we use the same text file "file.txt"  but by class and functions#
"the execution file "exefile2.ring"#
Package MyLanguage.Natural
Class numbers
func getnumbers     
()startcommand            
"commandData()[:name]="numbers            
commandData()[:nExpr]=0            
[]=[commandData()[:aExpr]            
func braceexpreval_numbers nValue    
}"if isCommand() and commandData()[:name]="numbers            
}(if isNumber(nvalue                 
++[commandData()[:nExpr                       
commandData()[:aExpr]+nvalue                       
}if commandData()[:nExpr]=2                       
()Execute                              
{                        
{                    
{               
func AddAttributes_numbers       
("AddAttribute(self,"numbers               
func Execute               
(division_result=expr(1)/expr(2                     
see "result1=" + division_result+nl

الكود

,يمكن الحصول علي العديد من ال Expressions كما في المثال التالي:

"file name is "numbers.ring#
Package MyLanguage.Natural
Class numbers
func getnumbers     
()startcommand            
"commandData()[:name]="numbers            
commandData()[:nExpr]=0            
[]=[commandData()[:aExpr]            
func braceexpreval_numbers nValue    
}"if isCommand() and commandData()[:name]="numbers            
}(if isNumber(nvalue                   
 remain add numeric expressions to list untill expr3 then i can used them in the code#
++[commandData()[:nExpr                           
commandData()[:aExpr]+nvalue                                 
}if commandData()[:nExpr]=3                                       
()execute1                                               
{                                        
{                         
{                 
func AddAttributes_numbers    
("AddAttribute(self,"numbers                 
func Execute1    
(division_result=expr(1)/expr(2                 
see"result1=" + division_result+nl                 
(add=division_result+expr(3                 
see"division_result+expr(3)="+add +nl
"file name is "thanks.ring#
Package MyLanguage.Natural
class thanks     
func AddAttributes_Hello          
(AddAttribute(self,:thanks                  
func Getthanks          
See "ok" + nl
"file name is "mylanguage.ring#
"load "stdlib.ring
"load "naturallib.ring
}MyLanguage = New NaturalLanguage
(SetLanguageName(:Language
("setCommandsPath("C:\Test\NaturalLibrary\Command
("SetPackageName("MyLanguage.Natural
("UseCommand("numbers
("UseCommand("thanks
("runfile("file.txt
{
"file name is "exefile2.ring#
"load"mylanguage.ring
}Mylanguage
(" (), &")SetOperators
")runstring
use the three file numbers'expr #
(numbers(100, 25,1
(numbers(10 ,2,2)&
(numbers(4 ,2,3)&
("
{

الكود

وكذلك يمكن الحصول علي العديد من ال expressions الحرفية كما في المثال التالي:

"file name is "say.ring#
expressions for strings#
Package MyLanguage.Natural
class say
func getsay       
()startcommand            
"commandData()[:name]="say            
commandData()[:nExpr]=0            
[]=[commandData()[:aExpr            
func braceexpreval_say cvalue      
}"if iscommand() and commandData()[:name]="say            
search for the string expressions and stored them in list untill forth expr#
}(if isstring(cvalue                   
commandData()[:aExpr]+cvalue                            
++[commandData()[:nExpr                            
}if commandData()[:nExpr]=4                            
()execute                                   
{                             
{                     
{              
func AddAttributes_say     
(AddAttribute(self,:say              
func execute     
See expr(4)+nl

الكود

والان قد وصلنا الي نهاية مقالتنا ونأسف علي الاطالة

للاطلاع علي المقالات الاخري من هنا

تستطيع الاطلاع علي المشاريع مفتوحة المصدر من الموقع  GitHub
الموقع الرسمي للغة  http://ring-lang.net

وشكرا لكم والي اللقاء

 

Natural Language Programming

أهلا بالجميع من كل مكان

نتعرف معا من خلال تلك المقالة على اللغة التي سهلت الطريق الي عالم البرمجة وأصبحت اليوم في شكل كتابة جمل بسيطة، سريعة، وعملية باللغة الإنجليزية “Natural”.

وتعرفنا في مقالة سابقة على Syntaxes متنوعة سهلت أيضا الطريق الي البرمجة الطبيعية بدون قيود وبدون الحاجة الي معرفة Compilers and Parsers.

ومن أمثلة تلك المميزات:

  • عدم التقيد باستخدام الفاصلة ;
  • عدم التقيد بال Enter، Tabs
  • استخدام دوال ال Setter، Getter للوصول الي ال attributes أو الجمل داخل ال object بسهولة.
  • استخدام الاقواس {} لادخال ال Objects بسهولة.

كما أن اللغة تعطيك المقدرة على كتابة اللغة بالكلمات التي تحبها، دون أن تشعر بقيود ب Sytax معين وسنتعرف على ذلك من خلال هذه المقالة.

ماذا ستحتاج لتعلم البرمجة الطبيعية Natural Language؟

ستتعلم فقط  اساسيات اللغة  وكيفية استخدام ال Object-Oriented

مثال توضيحي:

عن طريق الجملة البسيطة التالية:

Accept 2 numbers then print the sum

يقوم المستخدم بإدخال رقمين ثم يقوم مترجم اللغة بطباعة الناتج.

وسنتعرف من خلال الشرح علي أمثلة مثل ذلك.


مثال لعمل نافذة لها عنوان:

من خلال كتابة بسيطة مكونه من جملتين  باللغة الانجليزية كالاتي:

  1. I want window
  2. <Window title = <expression

يتم تنفيذ العمليات واحدة تلـو الاخـرى -ويمكـن نقـل التنفيـذ مـن نقطـة لأخرى من خلال جمل التحكم Control Structure.

الخطوات:

  • يتم تعريف كل الكلمات الطبيعية Keywordsالتي نريد نحن استخدامها داخل ال object.
  • يتم تعريف الكلمات التي نريد تجاهلها بقيم =0 داخل ال class ك attributes
  • يتم الانتقال بين الكلمات وبعضها عن طريق جمل التحكم “Control Structures” مع استخدام دوال ال getter &setter
  • عند الوصول الي expression، أي يوجد قيم “حرفية أو رقمية” فعندها نحصل على القيم بالطرق التي سوف نذكرها في هذه المدونة طبقا لشكل ال expression.
  • في المثال التالي نحصل على القيمة عن طريق دالة setter لوجود قيم مباشرة بعد علامة ال assignment”=”.

ملحوظة:

  • نظرا لان اللغة غير حساسة ل Tabs ,Enters نستطيع كتابة ال Attributes علي هيئة جمل بجانب بعضها البعض داخل ال  Objects.
  • ال attributes موجود باللون الازرق داخل الكود.
  • ال expressions موجود باللون الاخضر داخل الكود.
  • ال Comments موجود باللون الاحمر داخل الكود.
  • نستخدم المتغير nIwantWindow للانتقال من كلمة لاخري عن طريق Conditions.
  • الكلمات التي نريد تجاهلها  نعطي لها قيمة صفر 0.
  • ال Attribute المكرر كتابته لا نعرفة مرة أخري.
  • نستخدم دالة ال getter لعمل conditions للانتقال من كلمة لاخري حتي الوصول الي ال expressions.
  • نستخدم دالة ال setter للحصول علي قيمة ال expression داخل ال Object.

الكود:

explain how to move from instruction to others using control structures#
declare how to show instructions after = and have avalue number or strings#
New App
}
 I want window
 "The window title = "hello world
{
Class App
 i want window
nIwantWindow for jump from one word to a nother#
 nIwantwindow = 0
  Here we don't define the window attribute again#
 title
 nWindowTitle = 0
 Keywords to ignore, just give them any value#
 the=0

func geti    
 if nIwantwindow = 0       
 ++nIwantwindow                
 ok       
func getwant    
 if nIwantwindow = 1        
 ++nIwantwindow                 
 ok        
func getwindow    
 if nIwantwindow = 2        
 nIwantwindow= 0                
 see "Instruction : I want window" + nl                
 ok        
 if nWindowTitle = 0        
 ++nWindowTitle                
 ok        
func settitle cValue    
 if nWindowTitle = 1        
 nWindowTitle=0                
 see "Instruction : Window Title = " + cValue + nl                
 ok

 

الكود

ماذا لو استخدامنا كلمات نفس الكلمات المعرفة داخل اللغة مثل and| or| if؟ 

يكون كما تعرفنا في المقالة السابقة المقالة السابقة عن طريق الامر ChangeRingKeyword ونغير الكلمة الي اخري.

<ChangeRingKeyword <oldkeyword> <newkeyword

ملحوظة:

أي مجرد التعرف على حروف فقط ثم يتم فهم ال syntax في مرحلة ال Parsing.

  • يجب عمل restore للكلمة التي تم تغييرها.

مثال توضيحي:

changing Keyword#
ChangeRingKeyword and _and
New App
}
"I want window and the window title = "hello world
{

Class App
i want window
nIwantwindow = 0
title
nWindowTitle = 0
the=0 and=0
func geti      
if nIwantwindow = 0          
++nIwantwindow                      
ok          
func getwant       
if nIwantwindow = 1          
++nIwantwindow                        
ok          
func getwindow      
if nIwantwindow = 2          
++nIwantwindow                        
ok          
func getand      
if nIwantwindow = 3          
nIwantwindow= 0                       
see "Instruction : I want window" + nl                       
ok          
if nWindowTitle = 0          
++nWindowTitle                         
ok          
func settitle cValue     
if nWindowTitle = 1          
nWindowTitle=0                         
see "Instruction : Window Title = " + cValue + nl                        
ok          
       restore keyword again#
ChangeRingKeyword _and and

الكود

ماذا لو استخدامنا  كلمات بنفس أسماء المعاملات المعرفة داخل اللغة مثل “+ = – <> ,….؟

يكون كما تعرفنا في المقالة السابقة عن طريق الامر ChangeRingOperator ونغير اسم المعامل لاسم اخر.

<ChangeRingOperator <oldkeyword> <newkeyword

ملحوظة:

مثال توضيحي:

changing operators#
to escape from the scanner stage#
       _+   + ChangeRingoperator
New App
}
"I want window + the window title = "hello world
{
Class App
i want window
nIwantwindow = 0
the=0 +
0=title
nWindowTitle = 0
to not affect to the operators ++ when checking also in scanner stage#
   + +_   ChangeRingoperator
func geti          
if nIwantwindow = 0                
++nIwantwindow                              
ok                 
func getwant          
if nIwantwindow = 1                
++nIwantwindow                               
ok                 
func getwindow           
if nIwantwindow = 2                    
++nIwantwindow                                
ok                    
to define "+" as identifier#
     +_  +   ChangeRingoperator
+func get           
"to not affect to the string concatenation "+nl#
 +  +_   ChangeRingoperator
if nIwantwindow = 3                
nIwantwindow=0                               
see "Instruction : I want window" + nl                               
ok                
if nWindowTitle = 0                
++nWindowTitle                                
ok                 

func settitle cValue           
if nWindowTitle = 1                 
nWindowTitle=0                           
see "Instruction : Window Title = " + cValue + nl                         
ok

الكود

مثال اخر:

 changing operators and keywords #
ChangeRingKeyword and _and
ChangeRingOperator = is
New App
}
"I want window and the window title is "hello world
{
ChangeRingOperator is =i
Class App
i want window
nIwantwindow = 0
title
nWindowTitle = 0
the=0 and=0
func geti        
if nIwantwindow = 0              
++nIwantwindow                               
ok              
func getwant        
if nIwantwindow = 1               
++nIwantwindow                        
ok              
func getwindow         
if nIwantwindow = 2                
nIwantwindow= 0                          
see "Instruction : I want window" + nl                          
ok                
if nWindowTitle = 0                
++nWindowTitle                             
ok                 
= it can set the value of identifier "title" after i changed is to#
func settitle cValue            
if nWindowTitle = 1                 
nWindowTitle=0                          
see "Instruction : Window Title = " + cValue + nl                         
ok                 
restoring keyword#
ChangeRingKeyword _and and

الكود

مثال اخر:

jump from one word to another untill reaching expressions and neglect other words
changeringkeyword in _in
changeringoperator = be
}new natural
Ring will be 1 in the near future
{
= changeringoperator be
class natural
Ring will     
in=0 the=0 near=0 future=0
n=0
func getRing     
if n=0             
++n                    
ok             
func setwill nvalue    
if n=1             
n=0                     
see "Ring will be "+nvalue+nl                     
ok

الكود

Using Eval () with our Natural Code

  • نستخدم دالة Eval لتنفيذ الكود أثناء التشغيل ويكون داخل quotations.
  • كما يمكن تنفيذ الأوامر ChangeRingOperator & ChangeRingKeyword من داخل دالة Eval.
  • وكذلك الجمل الطبيعية يمكن التعرف عليها من داخل دالة Eval.

مثال توضيحي:

using eval#
using eval when passing in the scanner in cprogram#
ّ'=cProgram
ChangeRingKeyword and _and
ChangeRingOperator = is
"I want window and the window title is "hello world
'
New App
}
(eval(cProgram
{
code inside eval not affect to others outside#

Class App
i want window
nIwantwindow = 0
title
nWindowTitle = 0
the=0
change and operator to define it as identifier outside eval#
ChangeRingKeyword and _and
and=0
restore#
ChangeRingKeyword _and and
func geti          
if nIwantwindow = 0              
++nIwantwindow                             
ok              
func getwant          
if nIwantwindow = 1              
++nIwantwindow                             
ok              
func getwindow         
if nIwantwindow = 2              
nIwantwindow= 0                            
see "Instruction : I want window" + nl                            
ok               
if nWindowTitle = 0               
++nWindowTitle                              
ok               
func settitle cValue        
if nWindowTitle = 1               
nWindowTitle=0                        
see "Instruction : Window Title = " + cValue + nl                        
ok

الكود

BraceStart and BraceEnd Methods

BraceStart: تستخدم لتنفيذ ما بداخلها قبل تنفيذ ال Objects أو قبل فتح أل brace {}.

BraceEnd: تستخدم لتنفيذ ما بداخلها بعد تنفيذ  ال Objects قبل اغلاق ال brace {}.

مثال توضيحي:

BraceStart and BraceEnd Methods#
}o1=new test
changeringoperator = is
"my name is "sara
{
{}o1
 =changeringoperator is
class test
my name
my=0 name=0
n=0 is=0
func getmy       
if n=0             
++n                   
ok             
func setname cvalue        
if n=1             
n=0                   
see "my name is " + cvalue +nl                   
ok             
func bracestart       
see "what is your name?" + nl              
func braceend       
see "ok,thanks" + nl

الكود

BraceExprEval Method

نستخدمه للحصول على ال expressions بطريقة مباشرة سواء رقيمة مثل 1 2 3 أو حرفية مثل “Ring”

مثال توضيحي:

 get expressions using braceexpreval and neglect other words by control structures
changeringkeyword in _in
}new natural
Ring will be 1 in the near future
{
class natural
Ring will be
be=0 in=0 the=0 near=0 future=0
Keyword=0
func braceexpreval r            
while Keyword=1 or Keyword=2                    
Keyword=0                                
 return nothing in these conditions#                                
return                                
end                    
see"Ring will be "+r +nl                    
func getRing            
Keyword=1                     
func getwill            
Keyword=1                     
func getbe            
Keyword=1                     
func getin            
Keyword=2                     
func getthe            
Keyword=2                     
func getnear            
Keyword=2                     
func getfuture            
Keyword=2

الكود

مثال اخر:

}new natural
take 2 4 6 create mul
{
class natural
take=0 create=0 mul=0
keyword1=0
keyword2=0
func braceexpreval r             
if keyword1=1 or keyword2=1                         
keyword1=0 keyword2=0                                      
return                                      
 ok                         
alist+r                         
"create alist have all expressions"2,4,6"# 
                   
func gettake               
keyword1=1                          
func getcreate               
keyword2=1                          
func getmul               
             attributes must be after expressions that i want to make operation on them #
for x in alist                          
nmul=nmul*x                                   
next                          
see "Result of multiplication of expressions '2,4,6' is :"+nmul
private means attributes and methods inside it are declared to the class#
private
alist=[] nmul=1

الكود

مثال اخر:

changeringkeyword to _to
changeringkeyword and _and
changeringkeyword give _give
}new natural
i want to add 2 and 3 and give the sum then mul 10 with result
{
class natural

i=0 want=0 to=0 add=0 and=0 give=0 the=0 sum=0 then=0 mul=0 result=0 with=0

func braceexpreval r           
alist+r                            
#i take attribute result to be able to see all expressions before its"2,3,10"
func getresult           
for x in alist                   
if x=10                            
result=nsum*x                                 
ok                             
nsum=nsum+x                             
next                   
see "the result of sum and mul of expressions= "+result
private
alist=[] nsum=0

الكود

BraceError () Method

يستخدم للحصول على ال errors عند ادخال خطأ لل objects بداخل الاقواس {}.

مثال توضيحي:

BraceError () Method#
}new point
x=10 y=20 z=30
()test
{
class point x y z
test() not exist #
func braceerror          
see "Handle Error!" + nl                 
see "Message :" + cCatchError + nl

الكود

Clean Natural Code

كيف نحصل على Expressions علي هيئة كلمات فقط وليس “literal”؟

الحل:

نعمل اختبار أو فحص للخطأ الناتج عن عدم وضع قيمة ال expressions لسلسلة حرفية داخل quotations.

عن طربق الامر ()braceerror والامر Ccatcherror ثم نستخدم جمل التحكم للوصول الي الكلمات الموجودة بعد أخرنقتطين :

 عند استخدام Ccatcherror نحصل علي ال Error التالي:

Error (R3): Calling Function without definition: words

وبالتالي نستطيع أن نحصل علي Words الموجودة بعد اخر نقتطين : من خلال جمل التحكم كما سنري في الامثلة

كما يمكن استخدام ()braceend للحصول علي الكلمات بعد فحص الخطأ في النهاية.

مثال توضيحي:

using braceerror only#
print words that without insiding quotations#
result: hello sara#
}new app
hello sara
{
Class App
func braceerror        
 Error (R24) : Using uninitialized variable :hello Error (R24) : Using uninitialized variable :sara        
print index of : inside statements of cCatchError#
(":",index=substr(cCatchError               
 ":"remains taking all strings after : every increasing index untill s=0 or there is not
while index>0                  
(":",index=substr(cCatchError                            
(cCatchError= substr(cCatchError,index+1                            
end                  
                :result after the last  #
(see substr(cCatchError,1

الكود

مثال اخر:

using braceend and braceerror#
changeringoperator = is
}New App
I want window
The window title = sara
{
Class App
is=0
= changeringoperator is
i want window
nIwantwindow = 0
title
nWindowTitle=0
the=0 is=0
func geti         
if nIwantwindow = 0                 
++nIwantwindow                                
ok                 
func getwant         
if nIwantwindow = 1                  
++nIwantwindow                               
ok                  
func getwindow         
if nIwantwindow = 2                  
nIwantwindow= 0                               
see "Instruction : I want window" + nl                               
ok                  
if nWindowTitle=0                  
++nWindowTitle                                
ok                  
func gettitle         
if nWindowTitle=1                  
nWindowTitle=0                                
ok                  
func braceend         
see "Instruction : Window Title = " + literal                        
 Error (R24) : Using uninitialized variable : sara#
func braceerror         
(":",index=substr(ccatchError                
while index>0                
(":",index=substr(ccatchError                         
(ccatchError=substr(ccatchError,index+1                         
end                
(literal=substr(ccatchError,1                
private
""=literal          
changeringoperator = is

الكود

وبذلك نكون وضحنا بشكل كافي كيفية استخدام اللغة ك natural language.

وشكرا لكم والي لقاء اخر.

للاطلاع علي المقالات الاخري من هنا

تستطيع الاطلاع علي المشاريع مفتوحة المصدر من الموقع  GitHub
الموقع الرسمي للغة  http://ring-lang.net

 

 

 

Syntax Flexibility

مرحبا

نتحدث في هذه المقالة عن مميزات لغة البرمجة Ring ،تلك المميزات التي جعلتها تصل الي ترتيب متقدم ضمن اول 50 لغة علي مستوي العالم  في الترتيب العالمي ونأمل لها الترتيب الأول مستقبلا باذن الله.

مميزات لغة البرمجة Ring

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

Syntax Flexibility

تحتوي اللغة على “Styles” تتشابه مع اللغات الأخرى حتى تكون طبيعية مع المبرمجين، و”Styles” أخري سوف نذكرها اليوم في هذه المدونة، وكذلك تستطيع عمل مترجم للغات أخري بكل سهولة للكلمات وكذلك المعاملات البرمجية.

Types of Styles

سوف اذكر ال “Styles” مع مثال واحد وهو: الامر الخاص بالطباعة على الشاشة.

1-ال “Styles” الطبيعي للمستخدم العربي مثل See/Give

2-ال “Styles” الطبيعي للمستخدم الانجليزي مثل Put/Get

3-ال “Styles” الطبيعي للمبرمج مثل () print مع استخدام تلك المكتبة stdlib.ring

1-Styles of Control Structures

1-عن طريق استخدام كلمات خاصة” Special Keywords ” لإنهاء جمل التحكم “control structure”:

  • If statement
  • For loop
  • Switch
  • While
  • Try-Catch

Special Keywords

  • كلمة ok لإنهاء جملة if الشرطية
  • كلمة Off لإنهاء جملة Switch
  • كلمة End لإنهاء While /Try-Catch/For

2-عن طريق استخدام كلمة “ End ” لإنهاء جمل التحكم “control structure“.

ملاحظات:

  • في جملة “if” الشرطية: يمكنك استبدال “but” ب “elseif
  • وفي جملة “Switch” يمكنك استخدام “else” بدل “other“& “Case“بدلا من “On

3-عن طريق استخدام الاقواس” braces {}

يمكنك استخدام الاقواس {} لإنهاء جمل التحكم المختلفة بدلا من استخدام “end”.

مثال1:

if statement#
using "special Keywords" ,using "ok" to end#
x=7
if x =1
see "True"+nl
but x=0
see "False"+nl
else
see "Error"+nl
ok
"Using "elseif" as "but#
x=1
if x =1
see "True"+nl
elseif x=0
see "False"+nl
else
see "Error"+nl
ok
"Using "{}" as "special Keyword#
x=0
}if x =1
see "True"+nl
elseif x=0
see "False"+nl
else
see "Error"+nl
{

الكود

مثال2:

switch statement#
using "put/Get" and "off" to end switch#
"put "Enter the number
Get num
Switch num
on 1
see "True"+nl
on 0
see "False"+nl
other
see "Error"+nl
off
===========================#
"using "see/Get" and "case as on" , I mix between styles "on,case#
"put "Enter the number
Get $num
Switch $num
case 1
see "True"+nl
on 0
see "False"+nl
other
see "Error"+nl
off
===========================#

using "see/Get" and "case as on" ,"else as other", braces "{}" to end switch,I mix between styles#

"see "Enter the number
Get @num
}Switch @num
case 1
see "True"+nl
on 0
see "False"+nl
else
see "Error"+nl
{

الكود

مثال3:

for and while statements#
"using special keyword "next#
for x=1 to 5
see x+nl
next
==============#
"using "end" as "next#
for x=5 to 1 step -1
see x+nl
end
==============#
"using "{}" to end as "next , end#
}for x=1 to 5 step 1
see x+nl
{
"using "end#
x=0
while x< 5
see x+nl
++x
end
==============#
#using "{}" to end
x=0
}while x< 5
see x+nl
++x
{

الكود

2-Styles of Functions and Object-Oriented

1-عن طريق استخدام كلمات خاصةSpecial Keywords

  • نستخدم endpackage/endclass/endfunc لإنهاء Packages/Classes/Functions
  • نستخدم كلمة def/func لتعريف الدالة.

ملاحظة: يمكنك استخدام الاقواس () حول ال parameters الخاصة بالدالة(اختيارية)

2-عن طريق استخدام كلمة “ End “لإنهاء Packages/Classes/Functions

3-عن طريق استخدام الاقواس” braces {}

  • يمكنك استخدام الاقواس {} لتحديد بداية ونهاية كل من Packages/Classes/Functions
  • استخدام الاقواس {} لإدخال attributes، methods لل object

ملاحظة

  • يمكنك التنوع في ال Styles في نفس الملف.
  • وكذلك يمكنك عمل ملف يحتوي على Styles معينه، مع Styles مختلفة أخري في المشروع الواحد.

مثال1:

import numbers
}o1=new opr
num1=10
num2=5
 ()add() mul() sub
{
}package numbers
Class opr
num1 num2    
func add    
result=num1+num2        
see result+nl        
end    
func mul    
result=num1+num2       
see result+nl       
endfunc    
}def sub    
result=num1-num2       
see result+nl       
{    
endclass
{

الكود

Change Language Keywords and Operators

لا تقييد في تعلم اللغة، فكما أنها تتيح لك بعض الكلمات الخاصة في ال Styles، فهي تتيح لك أيضا حرية اختيار الكلمات البرمجية مثل While، For، If، …. الخ وبالتالي في تسمح لك بعمل مترجم لكل اللغات ولكل مستخدم من أي مكان.

  • نستطيع أن نغير الكلمات من خلال الامر ChangeRingKeyword.
  • نستطيع أن نغير المعاملات من خلال الامر ChangeRingOperator.
<ChangeRingKeyword <oldkeyword> <newkeyword
<ChangeRingOperator <oldkeyword> <newkeyword

ملحوظة:

  • يمكنك تغيير الكلمات والمعاملات أثناء التشغيل من خلال الامر ()Eval
  • ينبغي علي فريق العمل أن يتفقوا علي كلمات ومعاملات موحدة في المشروع الواحد.

مثال توضيحي:

3.jpg

الكود

Load Syntax Files

يمكنك عمل ملف يحتوي على مجموعة من الكلمات والمعاملات الجديدة  ثم استدعاء هذا الملف في أي مشروع  وذلك عن طريق الامر LoadSyntax

"LoadSyntax      "syntaxfile.ring

ملحوظة:

  • ينبغي عند عمل هذا الملف لتغيير ال “Syntax” الا يحتوي الا علي تلك الأوامر الخاصة بتغيير الكلمات والمعاملات.

مثال:

في هذا المثال قد أنشأت مترجم لجمل التحكم في اللغة باللغة العربية.

 تستطيع الاطلاع علي هذا الملف من هنا

وسميت هذا الملف باسم “SyntaxFile” بامتداد اللغة “ring.” ثم استدعيت هذا الملف في مشروع أخر.

"Loadsyntax "SyntaxFile.ring
x=0
طالما x<10
اطبع x+nl
x++
انهاء
=================#
x=1 y=1
اذاكان x=1 او y=0
اطبع "True"
واذاكان x=0 او y=0
اطبع "False"
غير ذلك
اطبع"خطأ"
حسنا

الكود

وهناك الكثير من المميزات ذكرناها في الشرح في مقالات سابقة ومنها:

  • اللغة غير حساسة لحالة الاحرف “Capital or Small”
  • تستطيع عمل تعليق عن طريق // أو # وكذلك عن طريق /* */ لأكثر من سطر.
  • اللغة لا تحتاج الي عمل فاصلة “;”  للفصل بين السطور البرمجية ولا تحتاج لعمل Enter,Tab
  • اللغة Lexical Scoping، Weakly Typed
  • يمكنك استخدام المتغيرات دون قيود كما في بعض اللغات تستخدم علامات مثل @، $ قبل المتغير.
  • وكذلك يمكنك استخدام علامة “+” للدمج بين السلسة الحرفية والرقمية وتقوم اللغة تلقائيا بالتحويل من رقمي الي حرفي والعكس طبقا لشكل الكتابة كما ذكرنا من قبل.

للاطلاع علي المقالات الاخري من هنا

تستطيع الاطلاع علي المشاريع مفتوحة المصدر من الموقع  GitHub
الموقع الرسمي للغة  http://ring-lang.net

وشكرا لكم والي اللقاء