このパートでは、複数の値で構成されるデータの取り扱いの基礎を扱います。
レッスン1 列挙演算子
値を列挙演算子,
で区切ると、それらの値を前から「順番に挙げるもの」となります。
$ fl7 '1, 2, 3, 4, 5'
1
2
3
4
5
ソースコードがこのような「順番に挙げるもの」であった場合、それらは改行を挟んで1行に1個ずつ出力されます。
,
は無駄に大量に記述しても、単に無視されます。
$ fl7 ',,,,,2,,,6,,,8,,,,,,'
2
6
8
列挙をはじめとする「順番に挙げるもの」全般を、fluorite-7ではストリーマ(流れをもたらすもの)と呼びます。
レッスン2 値の型
ストリーマは数値とは値の種類が異なります。
値の種類のことを型と呼びます。
値の型は「TYPE(
値)
」と記述することで文字列として取得できます。
列挙演算子の型は常にSTREAMERです。
$ fl7 'TYPE(10)'
NUMBER
$ fl7 'TYPE(10.5)'
NUMBER
$ fl7 'TYPE(10, 11)'
STREAMER
$ fl7 'TYPE(Hello)'
STRING
レッスン3 範囲演算子
2個の整数の間を範囲演算子..
もしくは~
で繋ぐと、それは範囲を表すストリーマです。
..
は終端を含み、~
は終端を含みません。
$ fl7 '1 .. 5'
1
2
3
4
5
$ fl7 '1 ~ 5'
1
2
3
4
終端が始端よりも小さい場合、範囲演算子はカウントダウンするストリーマをもたらします。
この場合も、~
は「終端」を含みません。
$ fl7 '2 .. -2'
2
1
0
-1
-2
$ fl7 '2 ~ -2'
2
1
0
-1
レッスン4 ストリーマの連結
列挙演算子の項目がストリーマだった場合、それは展開されてフラットなストリーマになります。
すなわち、,
はストリーマ同士を連結します。
ストリーマを入れ子にすることはできません。
$ fl7 '1, ((2, 3), 4 .. 6), (7 .. 9),'
1
2
3
4
5
6
7
8
9
レッスン5 配列
式を配列初期化子[
]
で囲むと、配列を得ることができます。
式はストリーマでも、1個の数値でも、空でもかまいません。
$ fl7 '[-10, 5 .. 10, 10 * 20]'
-10,5,6,7,8,9,10,200
$ fl7 '[200]'
200
$ fl7 '[]'
ソースコードの値が配列だった場合、含まれる値を先頭から順に,
で繋いで横に並べて出力します。
ストリーマと配列を組み合わせると、表のような形式の出力が得られます。
$ fl7 '[1, 2], [3, 4]'
1,2
3,4
ストリーマと異なり、配列は入れ子にできます。
$ fl7 '0, [1, [2, 3], 4], 5'
0
1,2,3,4
5
これだけではよく分からないので、データを文字列化するJSON関数を先取りしてデータ構造を見てみましょう。
$ fl7 'JSON(0, [1, [2, 3], 4], 5)'
0
[1,[2,3],4]
5
配列が入れ子になった状態で保存されていることが分かります。
レッスン6 配列要素へのアクセス
「配列[
添え字]
」という形で配列の要素にアクセスできます。
これは要素アクセス演算子と呼びます。
添え字は0から始まります。
$ fl7 '[123, 456, 789][1]'
456
添え字には式を記述することもできます。
$ fl7 '[123, 456, 789][[-1 .. 10][1 + 1]]'
456
レッスン7 NULL
配列の領域を超えたアクセスをした場合は、NULLという特殊な値が帰ります。
$ fl7 '[123, 456, 789][10]'
NULL
NULLは数値でも文字列でもない、無を表す特殊な値です。
NULLが欲しい場合、組み込み定数NULL
を使用します。
$ fl7 'NULL, TYPE(NULL), TYPE(TYPE(NULL)), JSON(NULL, "NULL")'
NULL
NULL
STRING
null
"NULL"
NULLの型はNULLです。
STRING型である、文字列の"NULL"
とは異なります。
レッスン8 配列のストリーマ展開
ストリーマから配列を作るには、単に[
]
で囲めばよいのでした。
一方で配列からストリーマを作るには、配列の後に空の[]
を付けます。
これをストリーマ展開と呼びます。
$ fl7 '[1, 2, 3][]'
1
2
3
配列から作ったストリーマも、他のストリーマと連結したり、再び配列にしたりできます。
$ 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 配列の長さ
配列に対して、前置$#
を付けることでその配列の要素数を得ます。
この演算子を長さ演算子と呼びます。
$ fl7 '$#[100, 200, 300]'
3
$ fl7 '$#[-125 .. -199, 45 ~ -3, 5, 0 .. 2]'
127
入れ子になった配列は、最も外側の配列の要素数を返し、含まれる配列は1個の要素としてカウントします。
$ fl7 '$#[100, [1 .. 200], 300]'
3
レッスン10 ストリーマの合計値
ストリーマに対して+
符号をつけると、ストリーマの合計値を得ます。
$ fl7 '+(1 .. 10)'
55
配列に対して+
符号とストリーマ展開演算子[]
を両方付けると、先にストリーマ展開が行われ、そのあとで符号が作用して合計値が得られます。
fluorite-7では、ほとんどの後置演算子は前置演算子に先行します。
$ fl7 '+[1 .. 10][]'
55
なお、配列に対して+
符号をつけると$#
演算子と同様に配列の要素数が得られますが、これは推奨されません。
前置+
演算子は、実は単純な符号でなく、数値化演算子なのです。
数値の数値化はその数値自体を返します。
そして、ストリーマの数値化は各要素を数値化したものの合計値です。
まとめ
- 値を順番に挙げるものをストリーマと呼ぶ。
-
TYPE(value)
で値の型が文字列として得られる。 - ストリーマを入れ子にしようとすると勝手に平坦になる。
-
,
..
~
などでストリーマが作れる。 - ストリーマを出力すると各要素が縦に並ぶ。
-
[
]
で囲うと配列になる。 - 配列を出力すると各要素が横に並ぶ。
- 「配列
[
添え字]
」で要素にアクセスする。 - 配列に後置
[]
でストリーマ展開を行う。 - 前置
$#
で配列の長さが得られる。 - 前置
+
でストリーマの合計値が得られる。