fluorite-7　日本語チュートリアル　Part 3　ストリーマと配列


[チュートリアルトップ](https://qiita.com/MirrgieRiana/items/a0906c72ebfb46693ab5)

[←前回](https://qiita.com/MirrgieRiana/items/27cd5c4f73b9c65eb168)　[次回→](https://qiita.com/MirrgieRiana/items/0010a9a0b68b6033d0d1)

このパートでは、複数の値で構成されるデータの取り扱いの基礎を扱います。

# レッスン1　列挙演算子

値を**列挙演算子**`,`で区切ると、それらの値を前から「順番に挙げるもの」となります。

```bash:
$ fl7 '1, 2, 3, 4, 5'
1
2
3
4
5
```

ソースコードがこのような「順番に挙げるもの」であった場合、それらは改行を挟んで1行に1個ずつ出力されます。

`,`は無駄に大量に記述しても、単に無視されます。

```bash:
$ fl7 ',,,,,2,,,6,,,8,,,,,,'
2
6
8
```

列挙をはじめとする「順番に挙げるもの」全般を、fluorite-7では**ストリーマ**（流れをもたらすもの）と呼びます。

# レッスン2　値の型

ストリーマは数値とは値の種類が異なります。
値の種類のことを**型**と呼びます。
値の型は「`TYPE(`値`)`」と記述することで文字列として取得できます。

列挙演算子の型は常にSTREAMERです。

```bash:
$ fl7 'TYPE(10)'
NUMBER

$ fl7 'TYPE(10.5)'
NUMBER

$ fl7 'TYPE(10, 11)'
STREAMER

$ fl7 'TYPE(Hello)'
STRING
```

# レッスン3　範囲演算子

2個の整数の間を**範囲演算子**`..`もしくは`~`で繋ぐと、それは範囲を表すストリーマです。
`..`は終端を含み、`~`は終端を含みません。

```bash:
$ fl7 '1 .. 5'
1
2
3
4
5

$ fl7 '1 ~ 5'
1
2
3
4
```

終端が始端よりも小さい場合、範囲演算子はカウントダウンするストリーマをもたらします。
この場合も、`~`は「終端」を含みません。

```bash:
$ fl7 '2 .. -2'
2
1
0
-1
-2

$ fl7 '2 ~ -2'
2
1
0
-1
```

# レッスン4　ストリーマの連結

列挙演算子の項目がストリーマだった場合、それは展開されてフラットなストリーマになります。
すなわち、`,`はストリーマ同士を連結します。
ストリーマを入れ子にすることはできません。

```bash:
$ fl7 '1, ((2, 3), 4 .. 6), (7 .. 9),'
1
2
3
4
5
6
7
8
9
```

# レッスン5　配列

式を**配列初期化子**`[` `]`で囲むと、配列を得ることができます。
式はストリーマでも、1個の数値でも、空でもかまいません。

```bash:
$ fl7 '[-10, 5 .. 10, 10 * 20]'
-10,5,6,7,8,9,10,200

$ fl7 '[200]'
200

$ fl7 '[]'

```

ソースコードの値が配列だった場合、含まれる値を先頭から順に`,`で繋いで横に並べて出力します。
ストリーマと配列を組み合わせると、表のような形式の出力が得られます。

```bash:
$ fl7 '[1, 2], [3, 4]'
1,2
3,4
```

ストリーマと異なり、配列は入れ子にできます。

```bash:
$ fl7 '0, [1, [2, 3], 4], 5'
0
1,2,3,4
5
```

これだけではよく分からないので、データを文字列化するJSON関数を先取りしてデータ構造を見てみましょう。

```bash:
$ fl7 'JSON(0, [1, [2, 3], 4], 5)'
0
[1,[2,3],4]
5
```

配列が入れ子になった状態で保存されていることが分かります。

# レッスン6　配列要素へのアクセス

「配列`[`添え字`]`」という形で配列の要素にアクセスできます。
これは**要素アクセス演算子**と呼びます。
添え字は0から始まります。

```bash:
$ fl7 '[123, 456, 789][1]'
456
```

添え字には式を記述することもできます。

```bash:
$ fl7 '[123, 456, 789][[-1 .. 10][1 + 1]]'
456
```

# レッスン7　NULL

配列の領域を超えたアクセスをした場合は、NULLという特殊な値が帰ります。

```bash:
$ fl7 '[123, 456, 789][10]'
NULL
```

NULLは数値でも文字列でもない、無を表す特殊な値です。
NULLが欲しい場合、組み込み定数`NULL`を使用します。

```bash:
$ fl7 'NULL, TYPE(NULL), TYPE(TYPE(NULL)), JSON(NULL, "NULL")'
NULL
NULL
STRING
null
"NULL"
```

NULLの型はNULLです。
STRING型である、文字列の`"NULL"`とは異なります。

# レッスン8　配列のストリーマ展開

ストリーマから配列を作るには、単に`[` `]`で囲めばよいのでした。
一方で配列からストリーマを作るには、配列の後に空の`[]`を付けます。
これを**ストリーマ展開**と呼びます。

```bash:
$ fl7 '[1, 2, 3][]'
1
2
3
```

配列から作ったストリーマも、他のストリーマと連結したり、再び配列にしたりできます。

```bash:
$ fl7 '[0, [1, 2, 3][], 4 .. 5]'
0,1,2,3,4,5

$ fl7 'JSON([0, [1, 2, 3][], 4 .. 5])'
[0,1,2,3,4,5]
```

# レッスン9　配列の長さ

配列に対して、前置`$#`を付けることでその配列の要素数を得ます。
この演算子を**長さ演算子**と呼びます。

```bash:
$ fl7 '$#[100, 200, 300]'
3

$ fl7 '$#[-125 .. -199, 45 ~ -3, 5, 0 .. 2]'
127
```

入れ子になった配列は、最も外側の配列の要素数を返し、含まれる配列は1個の要素としてカウントします。

```bash:
$ fl7 '$#[100, [1 .. 200], 300]'
3
```

# レッスン10　ストリーマの合計値

ストリーマに対して`+`符号をつけると、ストリーマの合計値を得ます。

```bash:
$ fl7 '+(1 .. 10)'
55
```

配列に対して`+`符号とストリーマ展開演算子`[]`を両方付けると、先にストリーマ展開が行われ、そのあとで符号が作用して合計値が得られます。
fluorite-7では、ほとんどの後置演算子は前置演算子に先行します。

```bash:
$ fl7 '+[1 .. 10][]'
55
```

なお、配列に対して`+`符号をつけると`$#`演算子と同様に配列の要素数が得られますが、これは推奨されません。

前置`+`演算子は、実は単純な符号でなく、**数値化演算子**なのです。
数値の数値化はその数値自体を返します。
そして、ストリーマの数値化は各要素を数値化したものの合計値です。

# まとめ

- 値を順番に挙げるものをストリーマと呼ぶ。
- `TYPE(value)`で値の型が文字列として得られる。
- ストリーマを入れ子にしようとすると勝手に平坦になる。
- `,` `..` `~`などでストリーマが作れる。
- ストリーマを出力すると各要素が縦に並ぶ。
- `[` `]`で囲うと配列になる。
- 配列を出力すると各要素が横に並ぶ。
- 「配列`[`添え字`]`」で要素にアクセスする。
- 配列に後置`[]`でストリーマ展開を行う。
- 前置`$#`で配列の長さが得られる。
- 前置`+`でストリーマの合計値が得られる。

# Part 4

[次回→](https://qiita.com/MirrgieRiana/items/0010a9a0b68b6033d0d1)