Extend a binary operation to a user defined type
__add_binary(op, return_type, binary_funct, lhs_type, rhs_type)
   String_Type op;
   Ref_Type binary_funct;
   DataType_Type return_type, lhs_type, rhs_type;
The __add_binary function is used to specify a function to be
called when a binary operation takes place between specified data
types.  The first parameter indicates the binary operator and must
be one of the following:
   "+", "-", "*", "/", "==", "!=", ">", ">=", "<", "<=", "^",
   "or", "and", "&", "|", "xor", "shl", "shr", "mod"
The second parameter (binary_funct) specifies the function to
be called when the binary function takes place between the
types lhs_type and rhs_type.  The return_type
parameter stipulates the return values of the function and the data
type of the result of the binary operation.
The data type for lhs_type or rhs_type may be left
unspecified by using Any_Type for either of these values.
However, at least one of the parameters must correspond to a
user-defined datatype.
This example defines a vector data type and extends the "*" operator to the new type:
    typedef struct { x, y, z } Vector_Type;
    define vector (x, y, z)
    {
       variable v = @Vector_Type;
       v.x = x;
       v.y = y;
       v.z = z;
       return v;
    }
    static define vector_scalar_mul (v, a)
    {
       return vector (a*v.x, a*v.y, a*v.z);
    }
    static define scalar_vector_mul (a, v)
    {
       return vector_scalar_mul (v, a);
    }
    static define dotprod (v1,v2)
    {
       return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z;
    }
    __add_binary ("*", Vector_Type, &scalar_vector_mul, Any_Type, Vector_Type);
    __add_binary ("*", Vector_Type, &scalar_vector_mul, Any_Type, Vector_Type);
    __add_binary ("*", Double_Type, &dotprod, Vector_Type, Vector_Type);
__add_unary, __add_string, __add_string<@@ref>__add_destroy__add_destroy
Specify a string representation for a user-defined type
__add_string (DataType_Type user_type, Ref_Type func)
The __add_string function specifies a function to be called
when a string representation is required for the specified
user-defined datatype.
Consider the Vector_Type object defined in the example
for the __add_binary function.
     static define vector_string (v)
     {
        return sprintf ("[%S,%S,%S]", v.x, v.y, v.z);
     }
     __add_string (Vector_Type, &vector_string);
Then
     v = vector (3, 4, 5);
     vmessage ("v=%S", v);
will generate the message:
     v=[3,4,5]
__add_unary, __add_binary, __add_binary<@@ref>__add_destroy__add_destroy, __add_typecast
Add a typecast-function for a user-defined type
__add_typecast (DataType_Type user_type, DataType_Type totype, Ref_Type func)
The __add_typecast function specifies a function to be called
to typecast the user-defined type to an object of type
totype.  The function must be defined to take a single
argument (the user-type to be converted) and must return an object
of type totype.
__add_unary, __add_binary, __add_binary<@@ref>__add_destroy__add_destroy, __add_string
Extend a unary operator to a user-defined type
__add_unary (op, return_type, unary_func, user_type)
   String_Type op;
   Ref_Type unary_func;
   DataType_Type return_type, user_type;
The __add_unary function is used to define the action of an
unary operation on a user-defined type.  The first parameter
op must be a valid unary operator
   "-", "not", "~"
or one of the following:
   "++", "--",
   "abs", "sign", "sqr", "mul2", "_ispos", "_isneg", "_isnonneg",
The third parameter, unary_func specifies the function to be
called to carry out the specified unary operation on the data type
user_type.  The result of the operation is indicated by the
value of the return_type parameter and must also be the
return type of the unary function.
The example for the __add_binary function defined a
Vector_Type object.  Here, the unary "-" and
"abs" operators are
extended to this type:
   static define vector_chs (v)
   {
      variable v1 = @Vector_Type;
      v1.x = -v.x;
      v1.y = -v.y;
      v1.z = -v.z;
      return v1;
   }
   static define vector_abs (v)
   {
      return sqrt (v.x*v.x + v.y*v.y + v.z*v.z);
   }
   __add_unary ("-", Vector_Type, &vector_chs, Vector_Type);
   __add_unary ("abs", Double_Type, &vector_abs, Vector_Type);
__add_binary, __add_string, __add_string<@@ref>__add_destroy__add_destroy
Get the value associated with a structure field
x = get_struct_field (Struct_Type s, String field_name)
The get_struct_field function gets the value of the field
whose name is specified by field_name of the structure
s. If the specified name is not a field of the structure, the
function will throw an InvalidParmError exception.
Retrieve the field names associated with a structure
String_Type[] = get_struct_field_names (Struct_Type s)
The get_struct_field_names function returns an array of
strings whose elements specify the names of the fields of the
struct s.
The following example illustrates how the
get_struct_field_names function may be used in conjunction
with the get_struct_field function to print the
value of a structure.
      define print_struct (s)
      {
         variable name, value;
         foreach (get_struct_field_names (s))
           {
             name = ();
             value = get_struct_field (s, name);
             vmessage ("s.%s = %s\n", name, string (value));
           }
      }
Determine whether or not an object is a structure
Integer_Type _is_struct_type (X)
The _is_struct_type function returns 1 if the parameter
refers to a structure or a user-defined type, or to an array of
structures or user-defined types.  If the object is neither, 0 will
be returned.
Determine whether or not an object is a structure
Integer_Type is_struct_type (X)
The is_struct_type function returns 1 if the parameter
refers to a structure or a user-defined type.  If the object is
neither, 0 will be returned.
Push the values of a structure's fields onto the stack
Integer_Type num = _push_struct_field_values (Struct_Type s)
The _push_struct_field_values function pushes the values of
all the fields of a structure onto the stack, returning the
number of items pushed.  The fields are pushed such that the last
field of the structure is pushed first.
Set the value associated with a structure field
set_struct_field (s, field_name, field_value)
   Struct_Type s;
   String_Type field_name;
   Generic_Type field_value;
The set_struct_field function sets the value of the field
whose name is specified by field_name of the structure
s to field_value.
get_struct_field, get_struct_field_names, set_struct_fields, array_info
Set the fields of a structure
set_struct_fields (Struct_Type s, ...)
The set_struct_fields function may be used to set zero or more
fields of a structure.  The fields are set in the order in which
they were created when the structure was defined.
    variable s = struct { name, age, height };
    set_struct_fields (s, "Bill", 13, 64);