組み込み定数は、コード上で定義することなく利用可能な、言語機能に付属する定数です。
組み込み定数は大文字および _
のみを使って定義されます。
組み込みの関数も組み込み定数と同じメカニズムによって提供されます。
各種組み込みオブジェクトのクラスを参照できます。
VALUE
NULL_CLASS
INT
DOUBLE
BOOLEAN
STRING
ARRAY
OBJECT
FUNCTION
STREAM
各種、特別な値を表す定数です。
定数 | 意味 |
---|---|
NULL N |
NULL値 |
TRUE T |
真 |
FALSE F |
偽 |
EMPTY E |
空のストリーム |
LOOP |
無限にNULLを生成するストリーム |
数学系の組み込み定数です。
定数 | 意味 |
---|---|
MATH.PI |
円周率 |
MATH.E |
ネイピア数 |
FLOOR
小数点以下切り捨てFLOOR(number: NUMBER): INTEGER
第1引数の数値を、値が小さい方の整数に丸めます。
$ flc 'FLOOR(1.5)'
# 1
DIV
除算の整数部DIV(x: NUMBER; y: NUMBER): NUMBER
x
を y
で割り、その結果の整数部分を返します。
$ flc 'DIV(10; 3)'
# 3
SQRT
平方根の取得SQRT(number: NUMBER): NUMBER
第1引数の正の平方根を返します。
$ flc 'SQRT(100.0)'
# 10.0
RAND
乱数の取得RAND(): DOUBLE
RAND([from: NUMBER; ]until: NUMBER): INT
引数なしで呼び出された場合、0以上1未満の小数を返します。
1引数で呼び出された場合、0以上 until
未満の整数を返します。
2引数で呼び出された場合、from
以上 until
未満の整数を返します。
REVERSE
ストリームを逆順にするREVERSE(stream: STREAM<VALUE>): STREAM<VALUE>
第1引数のストリームの要素を逆順にしたストリームを返します。
$ flc 'REVERSE(1 .. 3)'
# 3
# 2
# 1
DISTINCT
ストリームの重複要素を除去DISTINCT(stream: STREAM<VALUE>): STREAM<VALUE>
第1引数のストリームから重複する要素を取り除いたストリームを返します。
$ flc '1, 2, 3, 3, 3, 2, 1, 0 >> DISTINCT'
# 1
# 2
# 3
# 0
JOIN
ストリームを文字列に連結JOIN([separator: STRING; ]stream: STREAM<STRING>): STRING
第2引数のストリームの各要素を第1引数のセパレータで連結した文字列を返します。第1引数を省略した場合は ,
が使用されます。
$ flc 'JOIN("|"; "a", "b", "c")'
# a|b|c
$ flc 'JOIN("a", "b", "c")'
# a,b,c
セパレータやストリームの各要素は文字列化されます。
$ flc 'JOIN(0; 1, "b", {`&_`: _ -> "c"}{})'
# 10b0c
部分適用とともに用いることで、パイプチェーンに組み込みやすくなります。
$ flc '1 .. 3 | _ * 10 >> JOIN["|"]'
# 10|20|30
SPLIT
文字列をストリームに分割SPLIT([separator: STRING; ]string: STRING): STREAM<STRING>
第2引数の文字列を第1引数のセパレータで分割し、各部分をストリームとして返します。第1引数を省略した場合は ,
が使用されます。
パイプ演算子との親和性のために配列ではなくストリームとして返されることに注意してください。
SPLIT
は概念的に JOIN
と逆の操作を行います。
$ flc 'SPLIT("|"; "a|b|c")'
# a
# b
# c
$ flc 'SPLIT("a,b,c")'
# a
# b
# c
セパレータや分割対象文字列は文字列化されて評価されます。
部分適用とともに用いることで、パイプチェーンに組み込みやすくなります。
$ flc '"10|20|30" >> SPLIT["|"] | +_ / 10'
# 1.0
# 2.0
# 3.0
KEYS
オブジェクトのキーのストリームを取得KEYS(object: OBJECT): STREAM<STRING>
第1引数のオブジェクトのキーのストリームを返します。
$ flc 'KEYS({a: 1; b: 2; c: 3})'
# a
# b
# c
VALUES
オブジェクトの値のストリームを取得VALUES(object: OBJECT): STREAM<VALUE>
第1引数のオブジェクトの値のストリームを返します。
$ flc 'VALUES({a: 1; b: 2; c: 3})'
# 1
# 2
# 3
SUM
ストリームの要素の合計SUM(numbers: STREAM<NUMBER>): NUMBER
第1引数のストリームの各要素を加算した値を返します。
$ flc 'SUM(1 .. 3)'
# 6
MIN
ストリームの最小値MIN(numbers: STREAM<NUMBER>): NUMBER
第1引数のストリームの最小値を返します。
ストリームが空の場合は NULL
を返します。
$ flc 'MIN(3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5)'
# 1
$ flc 'MIN(,)'
# NULL
MAX
ストリームの最大値MAX(numbers: STREAM<NUMBER>): NUMBER
第1引数のストリームの最大値を返します。
ストリームが空の場合は NULL
を返します。
$ flc 'MAX(3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5)'
# 9
$ flc 'MAX(,)'
# NULL
SORT
ストリームを昇順にソートするストリームを昇順にソートします。
SORT
は、3種類の呼び出し方があります。
SORT(stream: STREAM<VALUE>): STREAM<VALUE>
1引数で呼び出した場合、そのストリームの要素を昇順にソートしたストリームを返します。
$ flc '3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5 >> SORT >> JOIN[" "]'
# 1 1 2 3 3 4 5 5 5 6 9
SORT(comparator: VALUE, VALUE -> INT; stream: STREAM<VALUE>): STREAM<VALUE>
2引数で呼び出した場合、第1引数の比較関数を使用して第2引数のストリームをソートします。
以下の例では、各要素を3で割った余りでソートしています。
$ flc '1 .. 9 >> SORT[a, b -> a % 3 <=> b % 3] >> JOIN[" "]'
# 3 6 9 1 4 7 2 5 8
SORT(by: key_getter: VALUE -> VALUE; stream: STREAM<VALUE>): STREAM<VALUE>
第1引数が by
パラメータである場合、第2引数の各要素に対して key_getter
関数を適用し、その結果を比較してソートします。
以下の例では、各要素を3で割った余りでソートしています。
$ flc '1 .. 9 >> SORT[by: x -> x % 3] >> JOIN[" "]'
# 3 6 9 1 4 7 2 5 8
SORTR
ストリームを降順にソートするSORTR(stream: STREAM<VALUE>): STREAM<VALUE>
SORTR(comparator: VALUE, VALUE -> INT; stream: STREAM<VALUE>): STREAM<VALUE>
SORTR(by: key_getter: VALUE -> VALUE; stream: STREAM<VALUE>): STREAM<VALUE>
ストリームを降順にソートします。
ソートが降順である点を除き、 SORT
関数と同じです。
$ flc '3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5 >> SORTR >> JOIN[" "]'
# 9 6 5 5 5 4 3 3 2 1 1
CHUNK
ストリームを一定サイズの配列に分割CHUNK(size: NUMBER; stream: STREAM<VALUE>): STREAM<ARRAY<VALUE>>
第2引数のストリームの要素を第1引数で指定したサイズごとにまとめた配列のストリームを返します。
$ flc '1, 2, 3, 4, 5 >> CHUNK[2]'
# [1;2]
# [3;4]
# [5]
TAKE
ストリームの先頭を取得TAKE(count: INT; stream: STREAM<VALUE>): STREAM<VALUE>
第2引数のストリームから先頭 count
個の要素を取り出したストリームを返します。
$ flc '1, 2, 3 >> TAKE[2]'
# 1
# 2
TAKER
ストリームの末尾を取得TAKER(count: INT; stream: STREAM<VALUE>): STREAM<VALUE>
第2引数のストリームから末尾 count
個の要素を取り出したストリームを返します。
$ flc '1, 2, 3 >> TAKER[2]'
# 2
# 3
DROP
ストリームの先頭を破棄DROP(count: INT; stream: STREAM<VALUE>): STREAM<VALUE>
第2引数のストリームから先頭 count
個の要素を取り除いたストリームを返します。
$ flc '1, 2, 3 >> DROP[2]'
# 3
DROPR
ストリームの末尾を破棄DROPR(count: INT; stream: STREAM<VALUE>): STREAM<VALUE>
第2引数のストリームから末尾 count
個の要素を取り除いたストリームを返します。
$ flc '1, 2, 3 >> DROPR[2]'
# 1
FILTER
ストリームを条件で抽出FILTER(predicate: VALUE -> BOOLEAN; stream: STREAM<VALUE>): STREAM<VALUE>
第2引数のストリームの各要素に predicate
を適用し、その結果が真となった要素のみを含むストリームを返します。
$ flc '1, 2, 3, 4, 5 >> FILTER [ x => x % 2 == 0 ]'
# 2
# 4
REDUCE
ストリームの要素を累積するREDUCE(function: VALUE, VALUE -> VALUE; stream: STREAM<VALUE>): VALUE
REDUCE
は stream
の隣り合った要素を function
によって累積し、一つの値に集約する関数です。
REDUCE
は、しばしば部分適用によってストリームを処理する関数として用いられます。
$ flc 'REDUCE(a, b -> a + b; 1 .. 4)'
# 10
$ flc '1 .. 4 >> REDUCE[a, b -> a + b]'
# 10
この例は、1から4までのすべての隣接する値に対して a + b
を適当します。
すなわち、 1 + 2 + 3 + 4
と同じです。
ストリームの要素が1つしかない、もしくはストリームでない場合、その要素をそのまま返します。
$ flc '1 >> REDUCE[a, b -> a + b]'
# 1
ストリームが空の場合、 NULL
を返します。
$ flc ', >> REDUCE[a, b -> a + b]'
# NULL
TO_ARRAY
ストリームを配列に変換ARRAY(stream: STREAM<VALUE>): ARRAY<VALUE>
第1引数のストリームの各要素を配列に変換します。
$ flc 'TO_ARRAY(1 .. 3)'
# [1;2;3]
TO_OBJECT
エントリーのストリームをオブジェクトに変換OBJECT(stream: STREAM<ARRAY<STRING; VALUE>>): OBJECT
第1引数のストリームの各要素をエントリーとしてオブジェクトに変換します。
$ flc 'TO_OBJECT(("a": 1), ("b": 2), ("c": 3))'
# {a:1;b:2;c:3}
GENERATE
関数からストリームを生成GENERATE(generator: (yield: (value: VALUE) -> NULL) -> NULL | STREAM): STREAM<VALUE>
第1引数のジェネレータ関数を実行し、その関数内で yield
関数に渡された値をストリームとして返します。
yield
関数がストリームを返した場合、そのストリームは1回だけイテレートされます。
yield
関数は呼び出されるとサスペンドします。
$ flc '
GENERATE(yield -> (
yield << 1
yield << 2
yield << 3
))
'
# 1
# 2
# 3
JSON
値をJSON文字列に変換JSON(["indent": indent: STRING; ]value: VALUE | STREAM<VALUE>): STRING | STREAM<STRING>
value
をJSON形式の文字列に変換します。
ストリームを渡した場合、各要素を変換したストリームを返します。
$ flc '{a: 1; b: 2} >> JSON[indent: " "]'
# {
# "a": 1,
# "b": 2
# }
$ flc '{a: 1}, {b: 2} >> JSON'
# {"a":1}
# {"b":2}
JSOND
JSON文字列を値に変換JSOND(json: STRING | STREAM<STRING>): VALUE | STREAM<VALUE>
json
を対応する値に変換します。
ストリームを渡した場合、各要素を変換したストリームを返します。
$ flc ' "{\"a\": 1}", "{\"b\": 2}" >> JSOND '
# {a:1}
# {b:2}
CSV
配列をCSV文字列に変換CSV(["separator": separator: STRING; ]["quote": quote: STRING; ]value: ARRAY<STRING> | STREAM<ARRAY<STRING>>): STRING | STREAM<STRING>
文字列の配列やそのストリームを、CSV行の文字列やそのストリームにエンコードします。
$ flc ' [1;2;3] >> CSV '
# 1,2,3
$ flc '
(
[1;2;3],
[4;5;6],
[7;8;9],
) >> CSV
'
# 1,2,3
# 4,5,6
# 7,8,9
区切り文字は separator
パラメータで指定できます。
デフォルトはカンマ ,
です。
$ flc ' [1;2;3] >> CSV[separator: "|"] '
# 1|2|3
前後に半角空白やタブ文字を含むか、区切り文字か引用符か改行文字を含むセルは、引用符で囲むことで表現します。
引用符は quote
パラメータで指定できます。
デフォルトはダブルクォート "
です。
$ flc ' [1;" 2 ";3] >> CSV '
# 1," 2 ",3
$ flc ' [1;" 2 ";3] >> CSV[quote: "|"] '
# 1,| 2 |,3
引用符を含むセルは、引用符を2つ連続して書くことで表現します。
$ flc ' [1;" \"2\" ",3] >> CSV '
# 1," ""2"" ",3
CSVD
CSV文字列を配列に変換CSVD(["separator": separator: STRING; ]["quote": quote: STRING; ]csv: STRING | STREAM<STRING>): ARRAY<STRING> | STREAM<ARRAY<STRING>>
CSV行の文字列やそのストリームを、文字列の配列やそのストリームにデコードします。
多くの仕様は CSV
と共通です。
$ flc '
(
"1,2,3",
"4,5,6",
"7,8,9",
) >> CSVD
'
# [1;2;3]
# [4;5;6]
# [7;8;9]
区切り文字で区切られたセクションが空である場合、空文字列が返されます。
$ flc ' ",1,,3," >> CSVD >> JSON '
# ["","1","","3",""]
行頭・行末・区切り文字の前後にある半角空白やタブ文字は無視されます。
$ flc ' " , 1 , , 3 , " >> CSVD >> JSON '
# ["","1","","3",""]
SLEEP
指定時間の間処理を停止SLEEP(milliseconds: NUMBER): NULL
指定のミリ秒数だけ処理を停止します。
以下のサンプルコードでは、実行後1秒おいてから Hello, world!
が出力されます。
$ flc '
SLEEP(1000)
"Hello, world!"
'
# Hello, world!
この関数はスレッドをブロッキングせず、関数をサスペンドします。