ري أكس أكس

كتابة إملائية بأحرف كبيرة

في الأصل كانت تسمى فقط " Rex" و"المنفذ المعدل" ؛ " X" الاضافية تم إضاف لتجنب التعارض مع أسماء المنتجات الأخرى. والتوسع في Rexx إلى المنفذ الموسع المعدل يعتقد أن يكون backronym. وكانت ريكس أصلا كافة أحرفها كبيرة لأن رمز الكمبيوتر المركزي كان موجه بالحرف الكبيرة. وكان النمط في تلك الأيام أن كل أسماء تكون بأحرف كبيرة، ويرجع ذلك جزئيا تقريبا أن كل الرموز كانت لا تزال تكتب بالاحرف الكبيرة حينها، ثم أصبح المنتج REXX، وكلا من طبعات كتاب مايك كاوليشاو Cowlishaw تستخدم الإحرف الكبيرة. منالتسعينات كانت مكتوبة في المجمل Rexx، مع أحرف صغيرة : REXX. اعتبارا من عام 2008، مايك كاوليشا و Mike Cowlishaw يبدو وكأنه يفضل Rexx، وثائق آي بي إم استخدمت REXX، مقاييسANSI استخدمت REXX.

التكرار الحلقي

بناء التحكم في الحلقة في REXX يبدأ من DO وينتهي مع  END نهاية ولكنه يأتي في عدة أشكال. NetRexx  تستخدم الكلمة الرئيسية  LOOP بدلا من  DO لعمل التكرار الحلقي، في حين ooRexx تعامل LOOP و DO بالتساوي في حالة التكرار الحلقي.
الأشكال التقليدية : 
   do expression [count]
     [instructions]
   end
   do until [condition]
     [instructions]
   end
   do while [condition]
     [instructions]
   end
With an index variable:
   do i = x [to y ] [by z]
     [instructions]
   end
another variant:
   do i = x [by z ] [to y] [for k]
     [instructions]
   end
قد يتم حذف الخطوة الزائدة (Z أعلاه) وافتراضها إلى 1. ويمكن أيضا حذف الحد الأعلى (Y أعلاه) يمكن حذفها، مما يجعل الحلقة تستمر إلى الأبد. يمكنك أيضا يتم التكرار الحلقي إلى الأبد بدون متغير مؤشر مع هذا :
   do forever
     [instructions]
   end
يمكن للبرنامج الخروج من الحلقة الحالية مع تعليمات leave (والذي هو الطريق الطبيعي للخروج من الحلقة "الأبدية")، أو يمكن أن تختصر الطريق مع التعليمات iterate.
النماذج do while  و do until  متعادلة : 
  do forever
    if [condition] then leave                /*similar to WHILE*/
    [instructions]
  end
 
and:  
  do forever
    [instructions]
    if [condition] then leave                /*similar to UNTIL*/  
  end

الاشتراطية

اختبار الشروط مع إذا IF
   if [condition] then
     do
       [instructions]
     end
   else
     do
       [instructions]
     end
لاحظ أن فقرة ELSE اختياري. 
أو، باختصار :
   if [condition] then  do
                        [instructions]
                        end
                  else  do
                        [instructions]
                        end
للحصول على تعليمة واحدة، DO  و END  يمكن حذفها أيضاً :
   if [condition] then
     [instruction]
   else
     [instruction]
أو، في نسخة موجزة :
   if [condition] then   [instruction]
                  else   [instruction]
التفصيل اختياري، ولكنه يساعد على تحسين القراءة.

اختبار الشروط المتعددة

SELECT هو بناء CASE لـ REXX، مثل غيرها من العديد من البنيات المستمدة من PL/I:

   select
     when [condition] then
         [instruction]
     when [condition] then
       do
         [instructions]
       end
     otherwise
       [instructions] or NOP
   end
NOP لا يشير تنفيذ أي تعليمات. 
لاحظ أن بند OTHERWISE (الخلاف) اختياري. إذا تم حذفه ولا يتم استيفاء WHEN الشروط، ثم يتم رفع حالة القواعد.

المتغيرات البسيطة

المتغيرات في REXX ليس لها أنواع، وفي البداية يتم تقييمها بأسمائهم، في أحرف كبيرة. وهكذا يمكن أن تختلف أنواع المتغيرات مع استخدامها في البرنامج :
 say hello             /* =>  HELLO      */
 hello = 25
 say hello             /* =>  25         */
 hello = "say 5 + 3"
 say hello             /* =>  say 5 + 3  */
 interpret hello       /* =>  8          */
 drop hello
 say hello             /* =>  HELLO      */

المتغيرات المركبة

خلافا للعديد من لغات البرمجة الأخرى، REXX الكلاسيكية لا يوجد لديها دعم مباشر لمصفوفات المتغيرات التي تعالج بمؤشر عددي. بدلا من ذلك فإنها توفر متغيرات مركبة. المتغير المركب يتكون من جذع يليه ذيل A.. يتم استخدام (نقطة) لضم الجذع إلى الذيل. إذا كانت الذيول المستخدمة رقمية، فمن السهل لإنتاج نفس التأثير كمصفوفة.
 do i = 1 to 10
   stem.i = 10 - i
 end
بعد ذلك المتغيرات التالية مع القيم التالية موجودة : stem.1 == 9, stem.2 = 8, stem.3 == 7...
وخلافا للمصفوفات، مؤشر المتغير الجذعي غير مطلوب أن يكون له قيمة عددية. على سبيل المثال، الرمز التالي هو صحيح :

 i = 'Monday'
 stem.i = 2
في REXX أيضاً من الممكن تحديد قيمة افتراضية للجذع.
 stem. = 'Unknown'
 stem.1 = 'USA'
 stem.44 = 'UK'
 stem.33 = 'France'
بعد هذه المهام فإن مصطلح stem.3 سوف ينتج 'شيء غير معروف' 'Unknown'. 
ويمكن أيضا حذف كل الجذع مع عبارة DROP.
 drop stem.
وله أيضاً تأثير إزالة أي قيمة افتراضية معينة سابقا.
بالاتفاق (وليس كجزء من اللغة) مجمع stem.0 غالبا ما يستخدم لتتبع عدد العناصر الموجودة في الساق، على سبيل المثال إجراء لإضافة كلمة إلى قائمة قد تكون مشفرة مثل هذا : 
 add_word: procedure expose dictionary.
   parse arg w
   n = dictionary.0 + 1
   dictionary.n = w
   dictionary.0 = n
   return
ومن الممكن أيضا أن يكون هناك عناصر متعددة في ذيل المتغير امركب. على سبيل المثال : 
 m = 'July'
 d = 15
 y = 2005
 day.y.m.d = 'Friday'
يمكن استخدام عناصر الذيل الرقمي المتعدد لتوفير تأثير مصفوفة متعددة الأبعاد.
تم العثور على ملامح مشابهة لمتغيرات REXX المركبة في العديد من اللغات الأخرى (المصفوفات الترابطية في أووك AWK، علامات الرقم hashes في بيرل Perl، Hashtablesجداول البعثرة في جافا، الخ). ومعظم هذه اللغات توفير تعليمات للتكرار على كل المفاتيح (أو ذيول في لغة REXX) من مثل هذا البناء، ولكن هذا غير موجود في REXX الكلاسيكية. بدلا من ذلك فإنه من الضروري للحفاظ على قوائم المساعدة لقيم الذيل، حسب اقتضاء الأمر. على سبيل المثال في برنامج لعد الكلمات يمكن استخدام الإجراء التالي لتسجيل كل وجود لكلمة.

 add_word: procedure expose count. word_list
   parse arg w.
   count.w = count.w + 1 /* assume count. has been set to 0 */
   if count.w = 1 then word_list = word_list w
   return
ومن ثم لاحقا
 do i = 1 to words(word_list)
   w = word(word_list,i)
   say w count.w
 end
في سبيل بعض الوضوح من الممكن الجمع بين هذه التقنيات إلى جذع واحد. 
 add_word: procedure expose dictionary.
   parse arg w.
   dictionary.w = dictionary.w + 1
   if dictionary.w = 1 /* assume dictionary. = 0 */
     then do
       n = dictionary.0+1
       dictionary.n = w
       dictionary.0 = n
     end
   return

ثم لاحقا
 do i = 1 to dictionary.0
   w = dictionary.i
   say i w dictionary.w
 end
ومع ذلك، لا يوفر REXX شبكة أمان هنا، إذا كانت إحدى الكلمات رقم كامل أقل من  dictionary.0 ستفشل في ظروف غامضة.
التطبيقات الحديثة من REXX، بما في ذلك كائن REXX آي بي إم والتطبيقات مفتوحة المصدر مثل ooRexx تشمل بناء لغة جديدة لتبسيط التكرار أكثر من القيمة الجذعية، أو أكثر من مجموعة الكيانات أخرى مثل مصفوفة، قائمة، جدول، الخ. 
 do i over stem.
   say i '-->' stem.i
 end

التفسير (الترجمة)

تعليمات التفسير تقيم معاملاتها، وتعامل قيمتها كعبارة REXX. أحيانا التفسير هو أوضح وسيلة لتنفيذ المهمة، ولكن غالبا ما يستخدم عند وجود رمز أكثر وضوحا باستخدام مثلاً قيمة، value()..
 /* a touch of ليسب */
 X = 'square'
 interpret 'say' X || '(4) ; exit'
 SQUARE: return arg(1)**2
هذا يعرض 16 والمخارج. لأن محتويات المتغير في REXX هي سلاسل، متضمنة أرقام منطقية مع رموز أسية وحتى البرامج بأكملها، REXX يعرض تفسير السلاسل كمصطلحات مقيمة.
ويمكن استخدام هذه الميزة لتمرير الوظائف كمعاملات الوظيفة، مثل تمرير SIN، COS، إلخ. إلى الإجراء لحساب التكاملات.
علما بأن REXX توفر الوظائف الحسابية الأساسية فقط مثل ABS و DIGITS و MAX و MIN و SIGN و RANDOM، ومجموعة كاملة من التحويلات الثنائية والزائدة عن السداسية مع عمليات بت. وظائف أكثر تعقيدا مثل SIN يجب أن تنفذ بالتسويد أو يتم الحصول عليها من المكتبات الخارجية للطرف الثالث. إن بعض المكتبات الخارجية، التي تنفذ بتلك اللغات التقليدية، لا تدعم الدقة الموسعة.
الإصدارات اللاحقة (غير الكلاسيكية) تؤيد بناء المتغير CALL. جنباً إلى جنب مع وظيفة القيمة VALUE المتضمنة، يمكن استخدام CALL في مكان كثير من حالات التفسير INTERPRET.
هذا هو برنامج كلاسيكي :
 /* terminated by input "exit" or similar */
 do forever ; interpret linein() ; end
آلة حاسبة REXX أكثر تعقيدا قليلا:
 X = 'input BYE to quit'
 do until X = 'BYE' ; interpret 'say' X ; pull X ; end
PULL هو اختصار لـ parse upper pull (سحب تخليل علوي)
وبالمثل، ARG هو اختصار لـ   parse upper arg (معمل تحليل علوي)
وكانت قوة تعليمات التفسير لها استخدامات أخرى. حزمة برامج Valour software (الشجاعة) أعتمد عليها قدرة REXX التفسيرية لتنفيذ بيئة OOP. عثر على استخدام اخر لها في منتج ويستنغهاوس Westinghouse الغير معلن [disambiguation needed]  الذي يسمى آلة الزمن الذي كان قادرا على تصحيح الأخطاء الفادحة بشكل كامل.

الرقمية

say digits() fuzz() form()          /* => 9 0 SCIENTIFIC */
  say 999999999+1                     /* => 1.000000000E+9 */
  numeric digits 10                   /* only limited by available memory */ 
  say 999999999+1                     /* => 1000000000 */
  say 0.9999999999=1                  /* => 0 (false) */
  numeric fuzz 3
  say 0.99999999=1                    /* => 1 (true) */
  say 0.99999999==1                   /* => 0 (false) */
  say 100*123456789                   /* => 1.23456789E+10 */
  numeric form engineering
  say 100*123456789                   /* => 12.34567890E+9 */
  numeric digits 50
  n=2
  r=1
        do forever                    /* Newton's method */
        rr=(n/r+r)/2
        if r=rr then leave
        r=rr
        end
  say "root" n '=' r                  /*root 2=1.414213562373095048801688724209698078569671875377*/
  numeric digits 50
  e=2.5
  f=0.5  
       do n=3
       f=f/n
       ee=e+f
       if e=ee then leave
       e=ee
       end
  say "e=" e                           /*e=2.7182818284590452353602874713526624977572470936998*/

الإشارات

تعليمات إشارة REXX هدفها التغييرات الغير طبيعية في تدفق التحكم (راجع المقطع التالي). ومع ذلك، فإنه يمكن أن يساء استخدامها ومعالجتها مثل عبارة GOTO التي وجدت في لغات أخرى (على الرغم من أنها غير متساوية تماما، بسبب حلقات النهاية وبنيات أخرى). هذا يمكن ان ينتج رمز من الصعب قراءته difficult-to-read code.

معالجة الخطأ والاستثناءات

من الممكن في REXX التصدي للأخطاء والتعامل معها والاستثناءات الأخرى، وذلك باستخدام تعليمة SIGNAL (الإشارة). هناك سبع حالات للنظام: خطأ ERROR، الفشل FAILURE، توقف HALT، لا قيمة NOVALUE، غير مستعد NOTREADY، أرقام ضائعة LOSTDIGITS والقواعد SYNTAX. ومعالجة كل منها يمكن أن تبدل تشغيل أو إيقاف في رمز المصدر على النحو المرغوب فيه.
هذا المثال سوف يستمر حتى يتم وقفه من قبل المستخدم :
في معظم أجهزة الكمبيوتر، فإن الوقف يتحقق عن طريق الضغط على Ctrl-Pause  (وتسمى أيضا مفتاح الكسرأو الإيقاف).
في بعض الأنظمة المركزية، الضغط على مفتاح PA1 (يساعد البرنامج Program Assist).
 signal on halt;
 do a = 1
   say a
   do 100000 /* a delay */
   end
 end
 halt:
   say "The program was stopped by the user" 
 exit
تقريبا جميع برامج REXX الجادة تحتوي على إشارة novalue أو عبارة مماثل. هذا يعطل "الميزة"، حيث المتغيرات الغير معروف تحصل على (حالة الأحرف الكبيرة) الاسم كالقيمة. يمكن التحقق من حالة المتغير مع وظيفة SYMBOL المتضمنة تعيد VAR للمتغيرات المحددة.
الوظيفة VALUE يمكن استخدامها للحصول على قيمة المتغيرات دون أن تسبب حالة NOVALUE، ولكن الغرض الرئيسي منها هو لقراءة وتعيين متغيرات البيئة environment variables—المماثلة لPOSIXgetenv وputenv.