do select-type

control structure

Syntax
do select-type record-expression as alias
(case type-name 
   local-scope)+
(else 
   local-scope)?
done
    


Purpose

You can use the do select-type block to determine the type of a record at runtime.

  declare record publication
     field string publication-name
     field string publisher
  
  declare record book extends publication
     field string author              variable
     field string year-of-publication
     field string ISBN
  
  declare record periodical extends publication
     field integer issues-per-year
     field string  editor-in-chief
     field string  ISPN
  
  declare record novel extends book
     field string genre
  
  
  process
     local publication pubs             variable
     local novel       war-and-peace
     local periodical  field-and-stream
  
     set new pubs to war-and-peace
     set new pubs to field-and-stream
  
     repeat over pubs
        do select-type pubs as p
        case book
           output "Book%n"
  
        case periodical
           output "Periodical%n"
  
        case publication
           output "Publication%n"
        done
     again
          

The types specified in the case statements must be the type of the expression in the do select-type statement, or an extension of that type. This means that do select-type is useful only in cases where you have a shelf of a base type that may contain records of extended types and you need to determine the exact types of those records.

If the exact type of the tested expression is not specified in a case, then the closest base type will be selected. Thus the code above will print out:

  Book
  Periodical
          

The type of the first record on the pubs shelf is novel but there is no case for novel. novel is extended from book, so the case for book is selected. You can change the result by adding a case for novel to the program.

The do select-type statement includes an alias specified by as. This alias, which must be a legal OmniMark name, can be used in the case blocks to address the specific properties of the record.

The record expression specified in the do select-type statement is a base type of the type of the specified record. You cannot use that expression to access the record fields that belong only to the extended type. The alias, by contrast, is treated as a variable of the type specified in the case statement. Thus you can query all the properties of that specific type using the alias name:

  declare record point
     field integer x
     field integer y
  
  declare record pixel extends point
     field string color
  
  declare record point-3d extends point
     field integer z
  
  process
     local pixel a
     local point b variable
  
     set a:x     to 12
     set a:y     to 15
     set a:color to "RED"
  
     set new b to a
  
     do select-type b as pt
     case pixel
        output pt:color || "%n"
  
     case point-3d
        output "d" % pt:z || "%n"
  
     case point
        output "d" % pt:x || "," || "d" % pt:y
  
     else
        output "I'm stumped%n"
     done
          

A do select-type statement may include an else clause which will be selected in case that none of the case statement match the type of the tested expression, or the types that it extends.

Related Syntax
Related Concepts