構文
糖衣構文

糖衣構文

flow は少ない概念で実現されており、最低限必要な構文も少ないです。

ですが、それだけだとプログラムが冗長になってしまいます。そこで糖衣構文をサポートしています。

中置演算子

+ - などのノードは、中置演算子のように表記することができます(この時、2 つの入力を受け取るノードとして解釈されます)。

> 1 + 2 -> output
3.

これは、以下のプログラムとして解釈されます。

(1 ->) (2 ->) + -> output

中置演算子は組み合わせることもできます。

> 1 + 2 * 3 - 4 -> output
3.

適用

関数型言語での関数適用のような構文で入力を渡すこともできます。

> output 1
1.

これは、次のように解釈されます。

(1 ->) output

中置演算子と組み合わせることも可能です。以下の例では、 (1 == 2) が適用を用いて入力として渡されています。

> if (1 == 2) (then:-> "true!" -> output) (else:-> "false!" -> output)
false!.

これは、次のように解釈されます。

((1 ->) (2 ->) == ->) if (then:-> "true!" -> output) (else:-> "false!" -> output)

引数を複数適用することも可能です。 f a b(a ->) (b ->) f として解釈されます。

部分適用

引数は部分的に適用することもできます。部分適用された引数が優先され(より先に適用された引数だとみなされる) b -> f a(a ->) (b ->) f と解釈されます。

具体例は、セクションの説明をした後に紹介します。

セクション

中置演算子を部分適用したものをセクションといいます(Haskell と同じ)。

> 1 -> + 2 -> output
3.

左から部分適用する際は括弧を付ける必要があります。

> 1 -> (3 -) -> output
2.

部分適用した項が複合的な場合は括弧を省略しないでください。例: + (2 * 3)

部分適用・セクションの例

先ほどの章で、ifの第二引数の話をしました。これは、ifの下流に実際に渡される値を指定します。 例えば、次のようになります。

> 2 -> if (1 == 2) (then:-> * 2 -> output) (else:-> - 1 -> output)
1.
> 2 -> if (1 == 1) (then:-> * 2 -> output) (else:-> - 1 -> output)
4.

ここで、 if は部分適用されており、セクション * 2 - 1 が登場しています。 1 つ目のプログラムは、

((1 ->) (2 ->) == ->) (2 ->) if (then:-> (2 ->) * -> output) (else:-> (1 ->) - -> output)

として解釈されます。