Operations are executed from a chain of operation elements created at parse time and resolved later. For each operation, the interpreter performs the following steps:
Prints a record of the operation if the FLOW option is on.
Looks at the operands to make sure they have values. Only certain special operators are allowed to tolerate operands that have not been set to a value. The interpreter checks whether any argument has character values.
Inspects the operator and gives control to the appropriate execution routine. A separate set of routines is invoked for character values.
Checks the operands to make sure they are valid for the operation. Then the routine allocates the result matrix and any extra workspace needed for intermediate calculations. Then the work is performed. Extra workspace is freed. A return code notifies IML if the operation was successful. If unsuccessful, it identifies the problem. Control is passed back to the interpreter.
Checks the return code. If the return code is nonzero, diagnostic routines are called to explain the problem to the user.
Associates the results with the result arguments in the symbol table. By keeping results out of the symbol table until this time, the operation does not destroy the previous value of the symbol if an error has occurred.
Prints the result if RESET PRINT or RESET PRINTALL is specified. The PRINTALL option prints intermediate results as well as end results.
Moves to the next operation.