الأدارة المدير العــــام
عدد المساهمات : 45 تاريخ التسجيل : 28/07/2009
| موضوع: سلسلة دروس في لغة البرمجة Lua الأحد 6 أغسطس - 21:54:19 | |
| - مقدمة في لٌوا عبارة عن لغة برمجة للإضافات "Extension Programming Language" صممت لتدعم نمط البرمجة الإجرائية أو ما يسمى بالـ Procedural Programming مع مرافق وصف البيانات. لُوا صممت لتستخدم كلغة برمجة قوية وخفيفة الحمل لأي برنامج يحتاجه المرء.
Lua:مقدمة في العمليات - Conventions
سابدأ إن شاء الله أول درس في مقدمة لتعلم لغة البرمجة لوا Lua وهو الاتفاقيات - Conventions الاتفاقيات
الأسماء (أو كما تسمى بـ المعرفات) في لُوا يمكن أن تكون سلسلة من حروف، أرقام و شرطة سفلية (Underscores) بشرط ألا تبدأ برقم وتكون باللغة الإنجليزية. هذا يتزامن مع تعريف الأسماء في أغلب لغات البرمجة. تعريف "الحرف" يعتمد على موضعه الحالي: أي حرف أبجدي يعتبر من اللغة الحالية يمكن استخدامه كمعرف (Identifier). المعرفات تستخدم لتسمية المتغيرات (Variables) وحقول الجداول (Table Fields). الكلمات التالية محجوزة ولا تستطيع استخدامها كأسماء وتعريفات للمتغيرات لأن لوا تستخدمها لإجراء العمليات المختلفة:
and break do else elseif end false for function if in local nil not or repeat return then true until while
العلامات التالية دلالة على رموز أخرى
+ - * / % ^ # == ~= <= >= < > = ( ) { } [ ] ; : , . .. ...
لُوا لغة حساسة لحالة الأحرف: ذكرت سابقاً أن and اسم محجوز للغة نفسها، ولكن على سبيل المثال AND أو And أسماء مختلفة يمكنك استخدامها، أسماء صالحة لتكون معرفات. الاسماء التي تبدأ بشرطة سفلية _VERSION محجوزة للمتغيرات العالمية الداخلية (Internal Global Variables) المستخدمة من قبل لُوا.
التعليق في لُوا (وهو النص الذي يتم تجاهله في البرمجة) يبدأ بوصلتين متتاليتين -- في أي مكان خارج الاسم ويتنتهي بإنتهاء الخط. تستطيع أيضاً تعليق مجموعة من الأكواد البرمجية بواسطة إحاطتها بـ --[[ و --]] . ولإلغاء التعليق عن مجموعة الأكواد، ببساطة أضف -- في البداية ---[[--single line commented out تعليق خط برمجي واحد
--[[ entire block commented out تعليق أكثر من خط من الأكواد print( 10 ) print( 15 ) --]]
Lua: الأنواع والقيم - Types and Values لُوا لغة برمجة ديناميكية، وهذا يعني أن المتغيرات ليس لها أنواع؛ القيم فقط بها أنواع. لا توجد تعريفات للنوع في اللغة. كل القيم تحمل الأنواع الخاصة بها.
للإطلاع أكثر على تعريف لغات البرمجة الديناميكية:
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]
كافة القيم في لوا هي قيم من الدرجة الأولى أو First-class Values. وهذا يعني أن جميع القيم يمكن تخزينها في المتغيرات، تمريرها كقيم للعمليات، و إعادتها كنتائج. الأنواع الأساسية التي يجب أن تهتم بها هي كالتالي:
nil — فارغ هذا النوع من القيم والذي يتمثل بـ nil يختلف عن باقي القيم، ويمثل عدم وجود قيمة مفيدة أو حالة فراغ أو عدم للقيمة.
boolean — منطقية يمثل أنواع القيم التي تكون إما صحيح true أو خطأ false. كل من القيم المتمثلة في nil أو false ستنتج حالة خاطئة؛ بينما أي قيمة أخرى ستنتج حالة صحيحة.
number — رقم يمثل الأرقام الصحيحة (double-precision floating-point) [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]
string — سلسلة يمثل مصفوفة من الحروف. لُوا تدعم 8 بت: السلسلة يمكن أن تحتوي على أي حرف 8 بت، بما في ذلك جزءا لا يتجزأ من الأصفار.
function — عملية شرحها بالتفصيل في موضوع مستقل.
table — جدول آلية هيكلة البيانات الوحيدة في لُوا. شرحها بالتفصيل في موضوع مستقل.
توفر لُوا التحويل التلقائي بين قيمة سلسلة و عدد أثناء وقت التشغيل. أي عملية حسابية تطبق على سلسلة فإن لوا ستحاول تحويل هذه السلسلة إلى عدد. على العكس، كلما تم استخدام عدد في موقع حيث من المتوقع أن يكون سلسلة، يتم تحويل العدد إلى سلسلة، في شكل معقول. من أجل تحكم كامل على كيفية تحويل الأرقام إلى سلاسل أو العكس، استخدم الدالة string.format من مكتبة سلسلة.
Lua: الجداول - Tables
الجداول في لُوا، سهلة، قوية، مرنة ولا يمكن الاستغناء عنها أبداً !
الجداول هي الآلية الوحيدة في هيكلة البيانات في لوا.
تقوم الجداول بإنشاء مصفوفات ترابطية "Associative Arrays"، وهذا يعني أن المصفوفات يمكن فهرستها ليس فقط بالأرقام، ولكن مع أي قيمة إلا قيمة الفراغ nil. الجداول يمكن أن تكون غير متجانسة ويمكن أن تحتوي على قيم من جميع الأنواع باستثناء قيمة الفراغ nil.
لتمثيل السجلات (الخصائص)، تستخدم لوا اسم الحقل كفهرست. تدعم اللغة هذا التمثيل من خلال توفير a.name كتجميل برمجي لغوي إلى ["a["name.
تماماً كالفهرست، فقيمة حقل الجدول يمكن أن تكون من أي نوع باستثناء nil. على وجه الخصوص، لأن العمليات/functions هي قيم من الدرجة الأولى "first-class values"، حيث يمكن حتى لحقول الجدول أن تحتوي على العمليات أو الـ functions. وبالتالي يمكن أيضاً أن تحمل الجداول الأساليب أو ماتسمى بالـ methods.
الجداول عبارة عن كائنات "objects": المتغيرات في الواقع لا تحتوي على هذه القيم بل مراجع لهم فقط. فالتعيين، وتمرير العوامل، وعوائد العمليات تعود دائماً إلى ما يشير إلى هذه القيم؛ هذه العمليات لا تعني أي نوع من النسخ.
إنشاء الجدول يكون باستخدام قوسان مجعدان كما في { }
- الكود:
-
t = {} -- هنا نقوم بإنشاء الجدول
- الكود:
-
k = "x" - الكود:
-
t[k] = 3.14 -- تعيين حقل جديد بالجدول بمفتاح يساوي "x" وقيمة تساوي "3.14"
print( t[k] ) --> 3.14 print( t["x"] ) --> 3.14 print( t.x ) --> 3.14
t[2] = "foo" -- تعيين حقل جديد بالجدول بمفتاح يساوي "2" وقيمة تساوي "foo"
print( t[2] ) --> "foo"
الوصول إلى المدخلات
في المثال أعلاه، تم الوصول إلى المدخل مع اسم الحقل "x" بطريقتين: الأولى كخاصية باستخدام عامل النقطة والثانية في مؤشر للمصفوفة باستخدام
t["x"]
وهناك خطأ شائع هو الخلط بين t.x مع [t[x. الأول هو ما يعادل ["t["x: وهو جدول فهرسته من قبل سلسلة/string بـ "x" والثاني هو جدول فهرسته من قبل قيمة المتغير x.
Lua: المتغيرات - Variables
المتغيرات
ببساطة يمكن أن نعرف المتغيرات في لوا على أنها أماكن لحفظ القيم. هناك ثلاثة أنواع من المتغيرات: عالمية المجال، محلية المجال، وحقول مجدولة (global, local & table fields). أي متغير غير معرّف مسبقاً فهو nil بشكل افتراضيا و nil هنا تعني أنه لا توجد قيمة معينه للمتغير أو أنه فارغ. عالمية المجال
المتغيرات العالمية لا تحتاج لتعريفه "Declarations". يمكنك ببساطة تعيين قيمة لإنشائه:
print( s ) --> nil لا توجد قيمة لأننا لم نقم بتعيين أي قيمة فيطبع لنا s = "موقع أرابيا" print( s ) --> موقع أرابيا
المتغيرات العالمية تبقى موجودة ما دام التطبيق قيد التشغيل. يمكنك حذف متغير عمومي عن طريق تعيين لا شيء عليه، والمقصود تعيين قيمة بـ nil. عند هذه النقطة، المتغير العالمي يتصرف كما لو أنه لم تم تهيئة أبداً. s = nil print( s ) --> nil محلية المجال
يتم تعريف المتغيرات المحلية باستخدام عبارة local
x = 1 -- متغير عالمي local y = 10 -- متغير محلي
وخلافاً للمتغيرات العالمية، المتغيرات المحلية مرئية فقط في الكتلة الني تم التعريف بها. مجال المتغير المحلي يبدأ بعد إعلان وينتهي في نهاية الكتلة. غير مفهوم؟ لنأخذ مثال للتوضيح - الكود:
-
a = 10 local i = 1 - الكود:
-
while ( i <= 10 ) do local a = i*i -- المتغير هنا متغير محلي لأنه ضمن نطاق هذه الكتلة وقمنا بتعريفه كمحلي print( a ) --> 1, 4, 9, 16, 25, ... i = i + 1 end
print( a ) --> 10 (هنا المتغير عالمي 'a')
الحقول المجدولة
الحقول المجدولة ليست سوى عناصر للجدوال. تستطيع فهرستها كالمصفوفات لتعيين قيم للحقول. - الكود:
-
t = { foo="hello" } -- إنشاء جدول بحقل واحد باسم foo print( t.foo ) --> "hello"
t.foo = "مع السلامة" -- "foo" تعيين قيمة إلى حقل print( t.foo ) --> "مع السلامة"
t.bar = 10 --إنشاء حقل جديدة باسم "bar" print( t.bar ) --> 10 print( t["bar"] ) --> 10 ----------------------------------
Lua: التعبيرات - Expressions في هذا الموضوع سيتم شرح التالي:
العمليات الحسابية Arithmetic Operators
العوامل العلائقية Relational Operators
العوامل المنطقية Logical Operators
التسلسل أو الدمج Concatenation
معامل الطول Length Operator
معاملات الأسبقية Precedence العمليات الحسابية
لوا تدعم مشغلي الحسابات الثنائية المعتادة أو (binary arithmetic operators):
+ (addition) - (subtraction) * (multiplication) / (division) % (modulo) ^ (exponentiation)
لو تدعم أيضا علامة السالب الأحادي -
إذا كانت المعاملات أرقام numbers أو متسلسلات strings يمكن تحويلها إلا أرقام، جميع العمليات لها المعنى المعتاد. العمليات الأسيّة ستعمل لأي محتوى اُسي. على سبيل المثال:
x^(-0.5)
يحسب معكوس الجذر التربيعي إلى
x
مودولو Modulo يعرّف كـ
a % b == a - math.floor(a/b)*b
كما هو الحال في ما تبقى من حاصل القسمة وهو تقريب حاصل نحو ناقص ما لا نهاية. العوامل العلائقية
العمليات العلائقية في لوا هي:
- الكود:
-
== (equal to) ~= (not equal to) < (less than) > (greater than) <= (less than or equal to) >= (greater than or equal to)
جميع هذه العمليات تؤدي دائما في نتيجة صحيحة true أو خاطئة false
علامة المساواة (==) أولا تقارن نوع المعاملات. إذا كانت من أنواع مختلفة، ستكون النتيجة خاطئة false وإلا، سيتم مقارنة قيم المعاملات.
تتم مقارنة الأرقام numbers والمتسلسلات strings بالطريقة المعتادة. ومقارنة الكائنات objects بالرجوع إلى المصدر reference: يعتبر كائنين متساويين إلا إذا كانوا نفس الكائن. في كل مرة تقوم بإنشاء كائن جديد، هذا الكائن يختلف عن أي كائن موجود سابقاً.
لا تنطبق قواعد التحويل التلقائي إلى مقارنات المساواة. لذلك فإن
"0" == 0
سيقيم إلى false العوامل المنطقية
العوامل المنطقية في لوا هي:
and or not
كل نتائج العوامل المنطقية التي تنتج إما false أو nil ستنتج أو تعتبر دائماً كـ false وأي شيء آخر على سيكون true
"and" تنتج أول مقارن إذا كان هو false أو nil، وإلا تنتج المقارن الثاني (انظر المثال بالاسفل)
"or" تنتج أول مقارن إذا كان هو false أو nil، وإلا تنتج المقارن الثاني (انظر المثال بالاسفل)
"not" دائماً تنتج إما false أو true
شاهد الأمثلة للتضح لك الصورة جلية: - الكود:
-
10 or 20 --> 10 10 or error() --> 10 nil or "a" --> "a" nil and 10 --> nil false and error() --> false false and nil --> false false or nil --> nil 10 and 20 --> 20
التسلسل (Concatenation)
التسلسل أو تضمين أكثر من متسلسلة strings مع بعضهم البعض في لوا يمكن فعله بواسطة نقطتين (..) إذا كانت المعاملات متسلسلات أو أرقام، سيتم تحويلهما إلى متسلسة واحدة كالتالي:
local s = "foo".."10"
معامل الطول (Length Operator)
يمكن من حساب طول المتسلسة بواسطة علامة الترقيم (#) طول المتسلسة هو عدد البايت bytes الذي فيها — وبصورة أخرى عدد الأحرف إذا كانت باللغة الإنجليزية.
طول جدول/المصفوفة table يحدد عن طريق العناصر التي به على سبيل المثال
t[n]
معاملات الأسبقية Precedence
المعاملات للأسبقية أو المقارنة في لوا بالأسفل مرتبة من أدنى إلى أعلى الأولوية:
or and < > <= >= ~= == .. + - * / % not # - (unary) ^
العمليات - Functions في لوا
ي هذا الموضوع سيتم شرح العمليات أو الوظائف والتي تسمى بالـ Functions في لغة البرمجة لوا
العمليات/الوظائف كما هو المتوقع منها في أغلب لغات البرمجة عبارة عن مهمة واحدة أو مجموعة من المهام وعادة ما نقوم بتمرير بعض المدخلات inputs أو parameters (داخل الأقواس) كما في المثال بالأسفل. العملية تقوم بعمل بعض المهام tasks وبعد الإنتهاء من المهمة تقوم بطباعة النتيجة إن اردت.
وفيما يلي الطرق الشائعة لكتابة العمليات/الوظائف: - الكود:
-
local function f () --body end
local f = function() --body end
function f () --body end
f = function () --body end
الجميل جداً في لوا هو أن العمليات يمكن أن تكون متغيّر ، لذلك الجداول في لوا ممكن أن تخزن العمليات في خصائصها. هذا يسمح بمرونة في استخدام الجداول. تستطيع استخدامها لحصر مجموعة من العمليات في جدول. لتسهيل الصورة لنأخذ على سبيل المثال مكتبة الرياضات في لوا. في هذه الحالة، لحساب جا 100 أو sin 100، ستكتب:
math.sin(100)
هنا، العملية الرياضية ليست سوى مجرد جدول table والخاصية sin هي في الواقع العملية أو الوظيفة. Object Method طرق العنصر
العناصر objects في لوا متمثلة في الجداول tables. عرض عناصر كالـ (المربعات، الصور، الخ) و عناصر وقت التشغيل في المدى العالمي (global Runtime object) ليست سوى عناصر. كما في مكتبة الرياضيات، هذه العناصر تقوم بحفظ طرق العنصر (instance methods) كخصائص. وجه الاختلاف الوحيد، ومع ذلك، هو طريقة الكتابة syntax. يجب أن تخبر لوا أنك تعتزم لهذه العملية أن تسمى طرق العنصر object method وليست مجرد عملية عادية. وللقيام بذلك، يجب أن تستخدم عامل ( عوضاً عن عامل النقطة فقط. هذه يمكن أن يختلف في لغات البرمجة الأخرى، لنرى الاختلاف بين الجافاسكربت ولوا: Javascript
- الكود:
-
object.translate( 10, 10 );
Lua
- الكود:
-
object:translate( 10, 10 )
اتمنى أنني وفقت في الشرح وإذا كانت لديكم أسئلة، الرجاء كتابتها في التعليقات.
| |
|