COND
COND
The COND
command performs a conditional assignment.
Generally, the conditional assignment takes the following form:
target := COND condition ? expr1 : expr2
"target
" is a normal assignment target, usually the name of an S_TOOLS-STx variable, e.g. "#var".
"condition
" is a conditional expression like used with the IF
statement and the miscellaneous loop commands, e.g. the string "$#a == 7 || $#a == 42
" (for more examples, see the IF
statement).
Note that with conditional S_TOOLS-STx expressions there must always be intervening whitespaces between operators and their arguments (unless the argument is quoted). So, both "$#a == 7
" and "'$#a'=='7'
" are valid expression whereas "$#a==7
" is not.
Both "expr1
" and "expr2
" may be any expressions that may be normally used in an S_TOOLS-STx ":=
" assignment, with the only exception of a COND
expression (meaning that conditional assignments must not be nested for the time being). If, at runtime, the conditional expression "condition
" evaluates to truth, the value determined by the first expression, "expr1
", will be assigned to "target
". If "condition
" evaluates to falsehood, it will be the second expression, "expr2
", that gets assigned to target.
You may use any S_TOOLS-STx conditional expression you like for "condition
". Equally, there is no restriction on "expr1
" and "expr2
", except that they must not be built up from "COND
" expressions themselves. It is even (and also) possible to use command substitutions ("$(...)
"), nesting them as deeply as one feels inclined to.
Examples:
#min := cond $#a < $#b ? $#a : $#b // calculate minimum of #a and #b #abs := cond $#a < 0 ? num -$#a : $#a // calculate absolute value of #a #abs := cond $#a < 0 ? eval $#a*(-1) : $#a // an alternative to the above #absdiff := cond $#a > $#b ? eval $#a-$#b : eval $#b-$#a // absolute difference #len := cond $(length $#a) > 0 ? length $#a : length $#b // length of #a or, if empty, of #b
See the file conditional_assignment.sts
for further working examples.
Notes:
The COND
command is processed by the loader, and is therefore not available in the command line interface.
The COND
command may not contain a nested COND
command.