fluorite12

論理値の概要

論理値は、真 TRUE または偽 FALSE の2つの値を持つデータ構造です。

それぞれ、組み込み定数 TRUE および FALSE によって参照されます。

$ flc 'TRUE'
# TRUE

$ flc 'FALSE'
# FALSE

論理値化

論理値化演算子 ?value は、値の論理値化を行います。

$ flc '?1'
# TRUE

$ flc '?0'
# FALSE

値のタイプごとの論理値化

値のタイプによってどのように論理値化が行われるかが異なります。

全般的に、ある値のタイプにおいて、最も単純な値が FALSE で、それ以外は TRUE です。

値のタイプ TRUE になるもの FALSE になるもの
NULL なし NULL
数値 0に等しくない値 0に等しい値
論理値 TRUE FALSE
文字列 空文字列以外 空文字列
ストリーム いずれかの要素が TRUE すべての要素が FALSE
空ストリーム
配列 空でない配列 空配列
オブジェクト 1個以上のエントリーがあるもの
※オーバーライド可能
エントリーが1個もないもの
※オーバーライド可能

いくつかの、直観的には FALSE のように感じられる値が TRUE になることがあります。

論理値化のオーバーライド

論理値化は、値の ?_ メソッドを参照します。

オブジェクトの ?_ メソッドをオーバーライドすることで、論理値化の処理を変更することができます。

$ flc '
  Class := {
    `?_`: this -> this.value > 100
  }

  ?Class{value: 50},
  ?Class{value: 200},
'
# FALSE
# TRUE

否定論理値化

否定論理値化演算子 !value は、値の論理値化を行い、その否定を返します。

$ flc '!TRUE'
# FALSE

$ flc '!FALSE'
# TRUE

$ flc '!1'
# FALSE

論理演算子

論理積演算子

論理積演算子 boolean && boolean は、左辺が論理値化によって FALSE と評価される場合は左辺を返し、そうでない場合は右辺を返します。


両辺が論理値である場合、その結果は論理積演算と等価となります。

左辺値 右辺値 返却値
FALSE FALSE FALSE
FALSE TRUE FALSE
TRUE FALSE FALSE
TRUE TRUE TRUE

論理和演算子

論理和演算子 boolean || boolean は、左辺が論理値化によって TRUE と評価される場合は左辺を返し、そうでない場合は右辺を返します。


両辺が論理値である場合、その結果は論理和演算と等価となります。

左辺値 右辺値 返却値
FALSE FALSE FALSE
FALSE TRUE TRUE
TRUE FALSE TRUE
TRUE TRUE TRUE

論理演算子による条件分岐

論理演算子は、条件分岐の手段としても利用できます。

右辺の値が使われない場合、その値は評価自体が行われません。

演算子 右辺が評価される条件
condition && then condition の論理値化が TRUE である場合
condition \|\| else condition の論理値化が FALSE である場合
$ flc -q '
  check := value -> (
    value %% 2 && OUT("$value is divisible by 2")
    value %% 3 || OUT("$value is not divisible by 3")
  )

  check(4)
  check(9)
'
# 4 is divisible by 2
# 4 is not divisible by 3

条件演算子

三項演算子

三項演算子 condition ? then : else は、条件分岐のための演算子です。

condition の論理値化が TRUE として評価される場合は then 、そうでない場合は else を返します。

$ flc 'TRUE ? "Yes" : "No"'
# Yes

$ flc 'FALSE ? "Yes" : "No"'
# No

三項演算子も論理演算子と同様に不要な項は評価自体が行われないため、if文のように使うことができます。

$ flc -q '
  check := value -> (
    value %% 2 ? (
      OUT << "$value is even"
    ) : (
      OUT << "$value is odd"
    )
  )

  check(4)
  check(9)
'
# 4 is even
# 9 is odd

三項演算子の記法

三項演算子は入れ子にしたり、演算子の前で改行することができます。

$ flc '
  get_name := is_parent, is_man ->
    is_parent
      ? is_man
        ? "King"
        : "Queen"
      : is_man
        ? "Prince"
        : "Princess"

  get_name(TRUE; TRUE),
  get_name(TRUE; FALSE),
  get_name(FALSE; TRUE),
  get_name(FALSE; FALSE),
'
# King
# Queen
# Prince
# Princess

エルビス演算子

エルビス演算子 value ?: default は、 valueNULL である場合に default 、そうでなければ value を返す演算子です。

$ flc '"Orange" ?: "Apple"'
# Orange

$ flc 'NULL ?: "Apple"'
# Apple

トライキャッチ演算子

トライキャッチ演算子 try !? catch は、左辺で値がスローされなかった場合は左辺を、スローされた場合は右辺を返す演算子です。

スローされる値は、どのようなタイプの値である可能性もあります。

$ flc '"OK" !? "Failed"'
# OK

$ flc '!!"Error" !? "Failed"'
# Failed

スローされた値の受け取り

try !? (error => catch) により、スローされた値を受け取ることができます。

$ flc '!!12345 !? (e => "Error: #$e")'
# Error: #12345

文レベルのトライキャッチ演算子

キャッチ演算子は式レベルとしても文レベルとしても機能します。

文レベルの位置に書かれたキャッチ演算子は、両辺とも文として解釈しようとします。

この性質は、ストリームの戻り値を持つ文を書いた場合に違いが現れる場合があります。