Basic and markup types are first-class data types: they can be stored in shelves, passed to functions, and returned from them without any loss of information.
OmniMark offers three basic data types:
The following additional built-in data types describe various parts of markup:
markup-event
          
declared-attribute
          
attribute-declaration
          
content-model
          
element-declaration
          
entity-declaration
          
DTD
        
 The source and sink data types that are specialized for string and markup-event manipulation:
        
These types are used to construct data transformation pipelines, for either textual data or markup data.
 There is one more data type built into OmniMark itself: stream.
      
 The stream data type can be described as a union of string and string sink types. A
        shelf declared as stream acts as a string when closed, and as a string sink when
        open.
    
 opaque data types are data types implemented in an external library. You may declare a shelf of any
        opaque data type. Some of the external libraries that come with OmniMark implement various opaque data
        types. Some examples of opaque data types are:
        
BCD (Binary Coded Decimal) numbers
          
float data type for floating point numbers
          
db.database data type representing database connections
          
tcp.connection representing TCP network connections
        
 integer, BCD, and float are all numeric data types. How do you choose the appropriate
        numeric type for the data you are dealing with?
      
 If you are dealing with whole number quantities with no fractional parts, choose integer or BCD. integer has marginally simpler syntax, but a limited size. Use BCD if numbers could get
        bigger than an integer can handle. It is also slightly easier to do arithmetic and comparisons between
        numbers of the same data type, so choose BCD for integer values that will be involved in
        calculations with other BCD values.
      
 If you are dealing with numerical quantities with fractional parts, choose BCD unless you need to express
        
 In any of the above cases, use float.
      
 When in doubt, use BCD.
      
 There is no appreciable performance advantage in choosing float over BCD.
      
 Note that you should base your choice of numerical types on the set of interacting values rather than on each
        value individually. Choosing numbers of the same type for all interacting numbers (unless obviously
        inappropriate) will simplify your code and save on data conversions. Never mix float and BCD
        numbers in the same calculation; doing so always involves a loss of precision.
    
 The data types listed above can be combined to form more complex data types by using records. A record type is composed of fields, each of which has a data type of its own. This way, records are aggregate data types.