Expressions are used in:
The general form of an expression is one of the following:
|prefixOperator term||- 42
|term operator term||
Expression terms can be one of the following:
"This isn't a numeric value"
|hexadecimal string||'2 2bad'x|
|binary string||'1 01'b|
' + 7.9E42 '
|function result||left( 'abracadabra', 4 )|
|parenthesized expression||(2 + 2)
(2 + (6 * 3))
('your name is' name)
Furthermore, wherever a term can appear an expression can appear!
Here is an assignment instruction with an intricate expression:
vector = left( ' ', 8 * day1no ) || , overlay( ' > 'right( dayofmon, 2 )' < ' , , left( ' 1 2 3 4 5 ' || , ' 6 7 8 9 10 ' || , ' 11 12 13 14 15 ' || , ' 16 17 18 19 20 ' || , ' 21 22 23 24 25 ' || , ' 26 27 28 29 30 ' || , ' 31 ', (daysinmo * 8) ), , 1 + ((dayofmon-1) * 8) )
|(space)||date() time()||the space between the functions is an operator|
|(abuttal)||date() || time()||the '||' operator is an explicit abuttal operator|
|(abuttal)||date()' at 'time()||the quoted string is implicitly concatenated to the adjacent terms|
Rexx has two fundamental string concatenation operators.
Click here for a detailed description of string concatenation operators.
Numeric terms can be processed with the following operators:
|+||Add||21 + 21|
|-||Subtract||44 - 2|
|*||Multiply||6 * 7|
|/||Divide||84 / 2|
|%||Integer divide||85 % 2|
|//||Remainder||42 // 50||similar to modulo
but the result can be negative
|**||Power (exponent)||2 ** 4|
|Prefix +||(0 + number)||+ 42|
|Prefix -||(0 - number)||- 42|
Comparison operators compare two terms. The result of the comparison is '1' when the terms are equal, and '0' otherwise. There are two types of comparison operators -- strict and normal.
In normal comparisons, strings are compared for the length of the shorter term, and trailing spaces are ignored. The collating order of characters is implementation-dependent. There are significant differences between the ordering of characters in Ascii environments, versus EBCDIC.
When both terms in a normal comparison are numeric, then a numeric comparison is performed. '7' is less than '11' in a normal comparison.
In strict comparisons, trailing spaces are significant. Strict comparisons always compare string values, even though both terms are numeric. '7' is greater than '11' in a strict comparison!
|¬=, \=, ><, <>||not equal|
|>=, ¬<, \<||greater than or equal; not less than|
|<=, ¬>, \>||less than or equal; not greater than|
Note: The ¬ operator character may be absent in Ascii implementations. The backslash character (\) is now preferred.
Strict comparison operators are similar to normal comparison operators, but has doubled operators.
|¬==, \==||strictly not equal|
|>>||strictly greater than|
|<<||strictly less than|
|>>=, ¬<<, \<<||strictly greater than or equal; strictly not less than|
|<<=, ¬>>, \>>||strictly less than or equal; strictly not greater than|
Logical operators transform the boolean sense of one or two terms. A term is considered to be false if it is strictly equal to '0'. A term is considered to be true if it is strictly equal to '1'. Any values other than '0' or '1' are invalid, and cause error #34 (logical value not 0 or 1) to be raised.
|&||And||returns '1' when both terms are true, and '0' otherwise|
||||Or||returns '1' when either term is true, and '0' otherwise|
|&&||Exclusive or||returns '1' when one of the terms is true (but not both), and '0' otherwise|
|Prefix ¬, Prefix \||Logical not||returns '1' when the term is '0', and '0' when the term is '1'.|
Boolean expressions are used in the condition clauses of IF, DO, and WHEN instructions,
As mentioned above, the result of a boolean expression is considered to be false if it is strictly equal to '0'. A term is considered to be true if it is strictly equal to '1'. Any values other than '0' or '1' are invalid, and cause error #34 (logical value not 0 or 1) to be raised.
Some examples are helpful.
|if number < limit then ...||ok, hopefully both variables have numeric values|
|when result then ...||oops, what if result is not exactly '0' or '1'|
|do while lines( )||oops, you probably want to do: lines( ) > 0 instead|