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.
  • يتم الانتقال بين الكلمات وبعضها عن طريق جمل التحكم “Control Structures” مع استخدام دوال ال getter &setter
  • عند الوصول الي expression، أي يوجد قيم “حرفية أو رقمية” فعندها نحصل على القيم بالطرق التي سوف نذكرها في هذه المدونة طبقا لشكل ال expression.
  • في المثال التالي نحصل على القيمة عن طريق دالة setter لوجود قيم مباشرة بعد علامة ال assignment”=”.

ملحوظة:

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

BraceEnd: تستخدم لتنفيذ ما بداخلها بعد تنفيذ ما بداخل ال Objects.

ولتنفيذ ما بداخل BraceStart& BraceEnd يكون عن طريق استخدام أقواس ال Object {}

مثال توضيحي:

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 بطريقة مباشرة.

مثال توضيحي:

 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 Programming تستطيع الاطلاع عليها من خلال

موقع اللغة: http://ring-lang.net

أو من : GitHub

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

 

 

 

Advertisements

اترك رد

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s