control structure
do select-type record-expression as alias (case type-name local-scope)+ (else local-scope)? done
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.