論理値は、真 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
になることがあります。
"FALSE"
"0"
[FALSE]
{a: NULL}
論理値化は、値の ?_
メソッドを参照します。
オブジェクトの ?_
メソッドをオーバーライドすることで、論理値化の処理を変更することができます。
$ 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
は、 value
が NULL
である場合に 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
キャッチ演算子は式レベルとしても文レベルとしても機能します。
文レベルの位置に書かれたキャッチ演算子は、両辺とも文として解釈しようとします。
この性質は、ストリームの戻り値を持つ文を書いた場合に違いが現れる場合があります。