Fuzion Logo
flang.dev — The Fuzion Language Portal
JavaScript seems to be disabled. Functionality is limited.

bool.fz


# This file is part of the Fuzion language implementation.
#
# The Fuzion language implementation is free software: you can redistribute it
# and/or modify it under the terms of the GNU General Public License as published
# by the Free Software Foundation, version 3 of the License.
#
# The Fuzion language implementation is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
# License for more details.
#
# You should have received a copy of the GNU General Public License along with The
# Fuzion language implementation.  If not, see <https://www.gnu.org/licenses/>.


# -----------------------------------------------------------------------
#
#  Tokiwa Software GmbH, Germany
#
#  Source code of Fuzion standard library feature bool
#
#  Author: Fridtjof Siebert (siebert@tokiwa.software)
#
# -----------------------------------------------------------------------

# bool -- Standard Fuzion type 'bool'
#
# We need to apologize to George Boole for crippling his name a bit,
# just to safe us from typing one more letter.  But at least we stop
# here and do not use boo, bo or similar.
#
# bool is a choice type that can either be TRUE of FALSE.
#
# Note that 'TRUE' and 'FALSE' themselves are not of type 'bool'.
# Routines 'true' and 'false' are the preferred way to get a constant
# value of type 'bool'.
#
#
bool : choice FALSE TRUE, hasEquals bool is

  # not
  prefix ! bool is
    if bool.this then FALSE else TRUE

  # or with lazy evaluation
  infix ||  (lazy other bool) bool is
    fuzion.std.panic "bool.infix || is handled by front end"

  # and with lazy evaluation
  infix &&  (lazy other bool) bool is
    fuzion.std.panic "bool.infix && is handled by front end"

  # or
  infix |   (other bool) => bool.this || other

  # and
  infix &   (other bool) => bool.this && other

  # equivalence
  #
  # note that we do not use '==' for this to avoid confusion since
  # a == b == c for booleans might not behave as expected
  # ('true <=> false <=> false' evaluates to 'true')
  infix <=> (other bool) => if bool.this other else !other

  # equality check implementation for inherited hasEquals
  infix = (other bool) bool is
    bool.this <=> other

  # xor
  infix ^   (other bool) => if bool.this (!other) else  other

  # implies
  infix :   (lazy other bool) bool is
    fuzion.std.panic "bool.infix : is handled by front end"

  # ternary ? : -- NYI: This will be replaced by a more powerful match syntax
  ternary ? : (T type, lazy a, b T) => if bool.this a else b

  # human readable string
  redef asString => if bool.this "true" else "false"


# boolean value "false"
#
# Note that this value is of unit type >>FALSE<<, not of type >>bool<<, i.e.,
# if it is used for type inference as in
#
#    myBoolean := FALSE
#
# you will get a variable of type >>FALSE<<, it will not be possible to assign
# >>TRUE<< to it.  You can use >>false<< as an alternative to get type >>bool<<.
#
#
FALSE is


# boolean value "true"
#
# Note that this value is of unit type >>TRUE<<, not of type >>bool<<, i.e.,
# if it is used for type inference as in
#
#    myBoolean := TRUE
#
# you will get a variable of type >>TRUE<<, it will not be possible to assign
# >>FALSE<< to it.  You can use >>true<< as an alternative to get type >>bool<<.
#
#
TRUE is


# boolean value "false" as a constant of type >>bool<<.
#
#
false bool is FALSE


# boolean value "true" as a constant of type >>bool<<.
#
#
true bool is TRUE