An expression node may correspond to a complete temporary array constructed at run-time, or through some process of interpretation (akin to interpretation of the mooted of forall scripts) it may simply correspond to a scalar temporary inside a loop in some ``node code''.
The classes for expressions parallel the classes for arrays:
ExprInt, ExprFloat, ExprDouble, ...
b.plus(c)
corresponds to the array expression
b + c
The shape of the result is the union of the shape of the addend
and the argument. The operation is illegal if this union contains
any non-orthogonal range pairs.
Certain arithmetic coercions can be defined by overloading plus, eg
ExprInt ExprInt :: plus(ExprInt) ;
ExprFloat ExprInt :: plus(ExprFloat) ;
ExprFloat ExprFloat :: plus(ExprFloat) ;
ExprFloat ExprFloat :: plus(ExprInt) ;
Other analogous members (times, if, and so on) are provided.