Represents a set of named ordered values via a named type.
DEFINE ORDINAL ordinal_type_name {member_name [VALUE(integer)]
  [,...]} [{PRECISION | PREC}] (integer) [SIGNED | UNSIGNED] 
               	 The value assigned or assumed for the VALUE attribute must be a signed or unsigned integer, and may be specified as an XN constant. It must strictly increase.
define ordinal Subjects (Mathematics,   /* 0, starting value is zero when VALUE not specified */
                         Literature,    /* 1 */
                         Science,       /* 2 */
                         History);      /* 3 */
define ordinal Math (Algebra VALUE(101),  /* 101*/
                     Geometry,            /* 102 */
                     Calculus VALUE(301)); /* 301 */ 
                     			 define ordinal Subjects (Arithmetic,    /* 0, starting value is zero when VALUE not specified */
                         Literature,    /* 1 */
                         Science,       /* 2 */
                         History);      /* 3 */
dcl x ordinal Subjects;
   do x = first(:Subjects:) upthru last(:Subjects:);
       put skip list (ordinalname(x));
   end; 
                     				Prints:
MATHEMATICS LITERATURE SCIENCE HISTORY
Declare subject  ORDINAL Subjects;
Declare course TYPE Math;   /* ORDINAL & TYPE keywords are interchangeable */
     subject = Mathematics;
     course = Calculus;
     if subject = Mathematics then
         if course = Calculus then
             put skip list ('At the upper Limit!');
     subject = Algebra; /* illegal assignment, mismatched ordinal types */
     if subject = course then /* illegal comparison, mismatched ordinal types */
          put skip;;
                     			 Unsupported type functions include BIND, CAST, NEW, RESPEC, SIZE, and VALUE.