fluorite12

括弧 (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