record-type-name cast record-expression


You can use cast to force a record of an extended type that is resident on a shelf of its base type to be treated as the specified type rather than the base type. Operator cast cannot be applied to non-record values. If the type of the record-expression is not a subtype of the specified record-type-name, an run-time error is thrown. For this reason, the do select-type scope should be used in preference to cast if there is a possibility of failure.

One example of when this is useful is when you get a result of a function call and then want to access fields in the record returned by that function. You know what type the result is, based on the type you passed to it, but OmniMark still treats it as a record of the base type. Here is an example:

  declare record point
     field integer x
     field integer y
  declare record pixel extends point
     field stream color
  define dynamic point function
     clone value point p
     local point c
     set c:x to p:x
     set c:y to p:y
     return c
  define overriding pixel function
     clone value pixel p
     local pixel c
     set c:x to p:x
     set c:y to p:y
     set c:color to p:color
     return c
  define point function
     move-point value point a
             to value point b
     local point c
     set c to clone a
     set c:x to b:x
     set c:y to b:y
     return c
     local pixel a
     local point b
     set a:x to 5
     set a:y to 78
     set a:color to "red"
     set b:x to 87
     set b:y to 56
     output (pixel cast move-point a to b):color || "%n"