0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-06-20

チュートリアルトップ

←前回 次回→

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

レッスン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)で値の型が文字列として得られる。
  • ストリーマを入れ子にしようとすると勝手に平坦になる。
  • , .. ~などでストリーマが作れる。
  • ストリーマを出力すると各要素が縦に並ぶ。
  • [ ]で囲うと配列になる。
  • 配列を出力すると各要素が横に並ぶ。
  • 「配列[添え字]」で要素にアクセスする。
  • 配列に後置[]でストリーマ展開を行う。
  • 前置$#で配列の長さが得られる。
  • 前置+でストリーマの合計値が得られる。

Part 4

次回→

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?