StackLang booleans are very conventional - there are literal true and false values
formed by entering those symbols. These symbols are not commands, unlike the number constants.
A (possibly redundant) EBNF definition of booleans is given below.
true-symbol = "true" ; false-symbol = "false" ; boolean = true-symbol | false-symbol ;
boolean? : Any -> Boolean
Produces true if input is a boolean, false otherwise.
false? : Any -> Boolean
Produces true if input is false, false otherwise.
true? : Any -> Boolean
Produces true if input is true, false otherwise.
boolean-to-string : Boolean -> String
Produces the string "true" if input
is true, "false" otherwise.
string-to-boolean : Boolean -> String
Produces a boolean as if the string were read in
from the interpreter. Fails with a RuntimeError if string cannot be parsed.
if : Boolean Any Any -> Any
If boolean is true, produces the third (furthest away from
the active end) element. Else, produces the second element. Arguments to if must, as an effect of the
evaluation rules, be evaluated before the evaluation of the if.
not : Boolean -> Boolean
Produces false if input is true, and
true if input is false.
or : Boolean Boolean -> Boolean
Produces true if at least one input is true,
false otherwise. This will not short-circuit.
and : Boolean Boolean -> Boolean
Produces false if at least one input is
false, true otherwise. This will not short-circuit.
nor : Boolean Boolean -> Boolean
Produces false if at least one input is
true, true otherwise.
xor : Boolean Boolean -> Boolean
Produces true if the two inputs are not
the same, false otherwise.
nxor : Boolean Boolean -> Boolean
Produces true if the two inputs are the
same, false otherwise.
nand : Boolean Boolean -> Boolean
Produces true if at least one input is
false, false otherwise.
implies : Boolean Boolean -> Boolean
Produces true if the second implies
(not the second or the first) the first.
eqv? : Any Any -> Boolean
Produces true if given elements are equal or equivalent.