(value)
括弧 (
)
は任意の式を内部に含めることができる、何も行わない因子です。
括弧は計算順序の変更などに使うことができます。
$ flc '(1 + 2) * 10'
# 30
括弧内には、実際には複文を書くことができます。
以下のサンプルコードでは、変数 a
を0で初期化して、括弧内で a
に100を代入し、括弧自体は a + 20
である120を返します。括弧の値は3と和を取られ、結果、プログラムの出力は123になります。
fluorite12では、多くのプログラミング言語とは異なり、複文に {
}
を使うことはできません。
$ flc '
a := 0
(
a = 100
a + 20
) + 3
'
# 123
括弧の内側で宣言された変数は、括弧外に影響を及ぼしません。
$ flc '
a := 10
(
a := 20
OUT << a
a = 30
OUT << a
)
a
'
# 20
# 30
# 10
ルートノードではファイル全体や括弧の直下など、どんな式でも書ける場所のルールを定義します。
runner; ...; getter
複文は、0個以上の文と複文自体の値となる末尾式を ;
で区切って繋いだものです。
以下のサンプルコードにおいて、最後の a
の行のみが式(getter)扱いで、その上の3行は文(runner)扱いです。
以下のサンプルコードでは、変数 a
を宣言しつつ10を代入し、10が格納されている a
の値を出力、次に a
に20を代入し、末尾式として20の格納されている a
を指定しています。
$ flc '
a := 10;
OUT << a;
a = 20;
a
'
# 10
# 20
末尾式は省略することができます。
その場合、文が末尾式でないことを示すために、末尾に ;
が必要となる場合があります。
末尾式が省略された複文の値は常に NULL
となります。
$ flc '1 + 2;'
# NULL
$ flc ''
# NULL
複文内での ;
の記述は、末尾を除いて柔軟です。
項の前や中間に ;
を余計に多く書いても問題ありません。
末尾式の後にはセミコロンを書くことはできません。
また、改行は ;
の代わりになります。
$ flc '
a := 10
OUT << a
; ; ; a = 20; ; ;
a
'
# 10
# 20
式の要素にラベルを付けて、そのラベルへ明示的に値を返しつつ、処理を早期に脱出できます。
formula !: label
で式 formula
に対してラベルを付与できます。
formula
内では、 label !! value
でそのラベルに対して値を返すことができます。
$ flc '
(
label !! 10
20
) !: label
'
# 10
なお、ラベルは変数とは異なり、値を持ちません。
リターンはループからの途中脱出にも利用できます。
以下の例では、1から100までの整数を順番にループしつつ、2でも3でも5でも割り切れる数を探します。
$ flc '
(
1 .. 100 | (
(_ % 2 == 0 && _ % 3 == 0 && _ % 5 == 0) && found !! _
)
NULL
) !: found
'
# 30
関数に渡すラムダ式の内側から、外側のラベルに対してリターンすることもできます。
$ flc '
for_each := array, block -> array() | block(_)
(
array := [1 .. 100]
for_each(array; _ -> (
(_ % 2 == 0 && _ % 3 == 0 && _ % 5 == 0) && found !! _
))
NULL
) !: found
'
# 30