組み込みプロパティ
組み込みプロパティとは、型ごとに用意された特殊な値あるいは関数です。
オブジェクトのプロパティのように.<name>
の記法で呼び出すことができます。([<str>]
の記法は使えません)
// 例
'ai kawaii'.len //9
Core:range(0,2).push(4) //[0,1,2,4]
今の所、数値・文字列・配列・エラー型に対応するものが用意されています。オブジェクトのそれに相当するものは、記法との兼ね合いでstd関数として実装されています。
書式
本ページでは、(型名)型の任意の値に対する組み込みプロパティを下記のような形式で表記します。
#(v: 型名).プロパティ名
または
@(v: 型名).組み込みメソッド名(引数リスト): 返り値の型
#
から始まるものは関数以外の値を持つ組み込みプロパティです。@
から始まるものは関数の組み込みプロパティ(組み込みメソッド)です。
数値
@(x: num).to_str(): str
数値を文字列に変換します。
let x = 123
<: x.to_str()
@(x: num).to_hex(): str
数値から16進数の文字列を生成します。
let x = 123
<: x.to_hex()
文字列
#(v: str).len
型: num
文字列の長さを取得します。
let x = "Hello World!"
<: x.len
@(v: str).to_num(): num | null
文字列が数字であれば、数値に変換します。
let x = "123"
<: x.to_num()
let y = "abc"
<: y.to_num()
@(v: str).to_arr(): arr<str>
文字列を書記素クラスタ毎に区切り、配列にしたものを返します。
文字列に孤立サロゲートが含まれない場合、孤立サロゲートを返すことはありません。
@(v: str).to_unicode_arr(): arr<str>
文字列を Unicode コードポイント毎に区切り、配列にしたものを返します。
書記素クラスタは分割されます。
文字列に孤立サロゲートが含まれない場合、孤立サロゲートを返すことはありません。
@(v: str).to_unicode_codepoint_arr(): arr<num>
文字列を Unicode コードポイント毎に区切り、それぞれコードポイント値を取得し配列にしたものを返します。
文字列に孤立サロゲートが含まれない場合、孤立サロゲートを返すことはありません。
@(v: str).to_char_arr(): arr<str>
文字列を UTF-16 コード単位毎に区切り、配列にしたものを返します。
文字列にサロゲートペアが含まれる場合、上位と下位それぞれ孤立サロゲートを返します。
@(v: str).to_charcode_arr(): arr<num>
文字列を UTF-16 コード単位毎に区切り、それぞれUTF-16 コード単位を表す 0
から 65535
までの整数を取得し配列にしたものを返します。
文字列にサロゲートペアが含まれる場合、上位と下位それぞれ孤立サロゲートを返します。
@(v: str).to_utf8_byte_arr(): arr<num>
文字列を UTF-8 エンコードし、各バイト毎の 0
から 255
までの整数値を取得し配列にしたものを返します。
@(v: str).pick(i: num): str | null
文字列中の i 番目の文字を取得します。
let x = "Hello World!"
<: x.pick(6)
@(v: str).incl(keyword: str): bool
文字列中に keyword が含まれていればtrue
、なければfalse
を返します。
let x = "Hello World!"
<: x.incl("World")
let y = "こんにちは!"
<: y.incl("Hello")
@(v: str).starts_with(prefix: str, start_index?: num): bool
文字列が prefix で始まっていればtrue
、そうでなければfalse
を返します。
prefix が空文字列の場合は常にtrue
を返します。
start_index が指定されている場合、そのインデックスから始めます。
start_index がv.len
より大きいか-v.len
より小さい場合はfalse
を返します。
start_index が負の場合は末尾から数えます。
let x = "Hello World!"
<: x.starts_with("Hello")
<: x.starts_with("World", 6)
@(v: str).ends_with(suffix: str, end_index?: num): bool
文字列が suffix で終わっていればtrue
、そうでなければfalse
を返します。
suffix が空文字列の場合は常にtrue
を返します。
end_index が指定されている場合、そのインデックスの直前を末尾とします。(省略時はv.len
)
end_index がv.len
より大きいか-v.len
より小さい場合はfalse
を返します。
end_index が負の場合は末尾から数えます。
let x = "Hello World!"
<: x.ends_with("World!")
<: x.ends_with("Hello", 5)
@(v: str).slice(begin: num, end: num): str
文字列の begin 番目から end 番目の直前までの部分を取得します。
let x = "Hello World!"
<: x.slice(6, 11)
@(v: str).split(splitter?: str): arr<str>
文字列を splitter がある場所で区切り、配列にしたものを返します。
splitter が与えられなければ一文字づつ区切ります。
let x = "Hey, how are you?"
<: x.split()
<: x.split(",")
@(v: str).replace(old: str, new: str): str
文字列中の old を new に置換したものを返します。
let x = "Hello World!"
<: x.replace("World", "Ai-Chan")
@(v: str).index_of(search: str, fromIndex?: num): num
文字列中から search を探し、その添字を返します。
fromIndex が指定されていれば、その位置から検索を開始します。
fromIndex が負値の時は末尾からの位置(文字列の長さ+fromIndex)が使用されます。
該当が無ければ-1を返します。
let x = "Hello World!"
<: x.index_of("World")
<: x.index_of("World", -7)
@(v: str).pad_start(width: num, pad?: str): str
文字列の長さがが width になるように、先頭を pad の繰り返しで埋めた新しい文字列を返します。
pad を省略した場合、空白' '
で埋められます。
pad が長すぎる場合、pad の末尾が切り捨てられます。
let x = "7"
<: `Today is 2024/12/{x.pad_start(2, "0")}`
@(v: str).pad_end(width: num, pad?: str): str
文字列の長さがが width になるように、末尾を pad の繰り返しで埋めた新しい文字列を返します。
pad を省略した場合、空白' '
で埋められます。
pad が長すぎる場合、pad の末尾が切り捨てられます。
let x = "5"
<: `I want {x.pad_end(4, "0")} yen`
@(v: str).trim(): str
文字列の前後の空白を取り除いたものを返します。
let x = " Hello World! "
<: x.trim()
@(v: str).upper(): str
文字列中の英字を大文字に変換して返します。
let x = "Hello World!"
<: x.upper()
@(v: str).lower(): str
文字列中の英字を小文字に変換して返します。
let x = "Hello World!"
<: x.lower()
@(v: str).charcode_at(i: num): num | null
i 番目のにある UTF-16 コード単位を表す 0
から 65535
までの整数を返します。
インデックスは UTF-16 コード単位に基づきます。
文字列にサロゲートペアが含まれる場合、位置によって上位または下位の孤立サロゲートを返すことがあります。
i 番目の文字が存在しない場合は null が返されます。
@(v: str).codepoint_at(i: num): num | null
i 番目の文字のコードポイントを取得します。
インデックスは UTF-16 コード単位に基づきます。
文字列にサロゲートペアが含まれ、指定位置が下位のサロゲートである場合、下位の孤立サロゲートを返します。
i 番目の文字が存在しない場合は null が返されます。
配列
#(v: arr).len
型: num
配列の要素数を取得します。
let x = [1, 2, 3, 4, 5]
<: x.len
@(v: arr).at(index: num, otherwise?: value): value
配列の index の位置の要素を返します。
index が負の場合は末尾から数えます。
index が範囲外の場合は、代わりに otherwise を返します。
otherwise が省略されている場合はnull
になります。
let x = [1, 2, 3, 4, 5]
<: x.at(2)
<: x.at(-1)
<: x.at(5)
<: x.at(5, "Not Found")
@(v: arr).push(i: value): null
【この操作は配列を書き換えます】
配列の最後に要素を追加します。
let x = [1, 2, 3, 4, 5]
x.push(8)
<: x
@(v: arr).unshift(i: value): null
【この操作は配列を書き換えます】
配列の最初に要素を追加します。
let x = [1, 2, 3, 4, 5]
x.unshift(7)
<: x
@(v: arr).pop(): value
【この操作は配列を書き換えます】
配列の最後の要素を取り出します。
let x = [1, 2, 3, 4, 5]
let popped = x.pop()
<: popped
<: x
@(v: arr).shift(): value
【この操作は配列を書き換えます】
配列の最初の要素を取り出します。
let x = [1, 2, 3, 4, 5]
let shifted = x.shift()
<: shifted
<: x
@(a: arr).concat(b: arr): arr
配列を連結します。
let x = [1, 2, 3]
let y = [4, 5, 6]
<: x.concat(y)
// 元の配列は変更されません
<: x
<: y
@(v: arr<str>).join(joiner?: str): str
文字列の配列を結合して一つの文字列として返します。
let x = ["Hello", "World", "!"]
<: x.join(" ")
// 引数を省略するとそのまま連結されます
<: x.join()
@(v: arr).slice(begin: num, end: num): arr
配列の begin 番目から end 番目の部分を切り出して返します。
let x = [1, 2, 3, 4, 5]
<: x.slice(1, 4)
@(v: arr).incl(i: value): bool
配列に指定した値が含まれているかどうかを返します。
let x = [1, 2, 3, 4, 5]
<: x.incl(3)
<: x.incl(6)
@(v: arr).map(func: fn): arr
配列の各要素に対し func を非同期的に呼び出します。 それぞれの要素を func の返り値で置き換えたものを返します。
let x = ['田中', '鈴木', '山本']
<: x.map(@(v) {
return `{v}さん`
})
@(v: arr).filter(func: fn): arr
配列の要素のうち func が true を返すようなもののみを抜き出して返します。
順序は維持されます。
let x = [1, 2, 3, 4, 5]
<: x.filter(@(v) {
// 2で割り切れる、つまり偶数のみを抜き出す
return v % 2 == 0
})
@(v: arr).reduce(func: Callback, initial: value): value
Callback
: @(acm: value, item: value, index: num): value
配列の各要素に対し func を順番に呼び出します。
各呼び出しでは、前回の結果が第1引数 acm として渡されます。
initial が指定された場合は初回呼び出しの引数が(initial, v[0], 0)、
指定されなかった場合は(v[0], v[1], 1)となります。
配列が空配列であり、かつ initial が指定されていない場合はエラーになります。従って基本的には initial を指定しておくことが推奨されています。
let x = [1, 2, 3, 4, 5]
<: x.reduce(@(acm, v) {
// 合計を求める
return acm + v
}, 0)
@(v: arr).find(func: @(item: value, index: num) { bool }): value
配列から func が true を返すような要素を探し、その値を返します。
let x = [1, 2, 3, 4, 5]
<: x.find(@(v) {
// 3より大きい最初の要素を探す
return v > 3
})
@(v: arr).index_of(val: value, fromIndex?: num): num
配列から_val_と同じ値を探し、その添字を返します。
_fromIndex_が指定されていれば、その位置から検索を開始します。
_fromIndex_が負値の時は末尾からの位置(配列の長さ+fromIndex)が使用されます。
該当が無ければ-1を返します。
let x = [1, 2, 3, 4, 5]
<: x.index_of(3)
@(v: arr).reverse(): null
【この操作は配列を書き換えます】
配列を反転させます。
let x = [1, 2, 3, 4, 5]
x.reverse()
<: x
@(v: arr).copy(): arr
配列のコピーを生成します。
シャローコピーであり、配列やオブジェクトの参照は維持されます。
let x = [1, 2, 3, 4, 5]
let xCopy = x.copy()
// 配列を書き換える操作をしても…
xCopy.push(6)
// 元の配列には影響がありません
<: x
<: xCopy
@(v: arr).sort(comp: @(a: value, b: value)): arr
【この操作は配列を書き換えます】
配列の並べ替えをします。第1引数 comp として次のような比較関数を渡します。
安定ソートです。
- a が b より順番的に前の時、負の値を返す
- a が b より順番的に後の時、正の値を返す
- a が b と順番的に同等の時、0を返す
数値の並び替えではCore:sub
を渡すことで昇順、@(a,b){b-a}
を渡すことで降順ソートができます。
文字列用の比較関数としてStr:lt
(昇順), Str:gt
(降順)が用意されています。詳しくはstd.mdをご覧下さい。
let x = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
x.sort(Core:sub)
/*
もしくは…
x.sort(@(a, b) {
return a - b
})
*/
<: x
@(v: arr).fill(val?: value, fromIndex?: num, toIndex?: num): arr
【この操作は配列を書き換えます】
配列の fromIndex から toIndex までの範囲の要素を val で置き換えます。
val 省略時はnull
で置き換えます。
fromIndex および toIndex に関する挙動はarr.slice
に準拠します。
let x = [1, 2, 3, 4, 5]
// 1番目から4番目までを0で埋める
x.fill(0, 1, 4)
<: x
@(v: arr).repeat(times: num): arr
配列を times 回繰り返した配列を作成します。arr.copy
同様シャローコピーであり、配列やオブジェクトの参照は維持されます。
times には0以上の整数値を指定します。それ以外ではエラーになります。
let x = [1, 2, 3]
<: x.repeat(3)
@(v: arr).splice(index: num, remove_count?: num, items?: arr<value>): arr<value>
【この操作は配列を書き換えます】
配列の index から remove_count 個の要素を取り除き、その位置に items の要素を挿入します。
返り値として、取り除いた要素の配列を返します。
index が負の場合は末尾から数えます。
index が最後の要素より後の場合は要素を取り除かず、挿入は末尾に追加します。
remove_count を省略した場合、末尾まで取り除きます。
items を省略した場合、何も挿入しません。
let x = [1, 2, 3, 4, 5]
// 2番目から2つ取り除き、その位置に[6, 7, 8]を挿入
let spliced = x.splice(2, 2, [6, 7, 8])
<: spliced // 取り除かれたものの配列
<: x // 取り除かれて挿入された後の配列
@(v: arr).flat(depth?: num): arr
配列に含まれる配列を depth で指定した深さの階層まで結合した新しい配列を作成します。
depth には0以上の整数値を指定します。省略時は1になります。
let x = [1, [2, 3], [4, [5, 6]]]
<: x.flat()
<: x.flat(2)
@(v: arr).flat_map(func: @(item: value, index: num) { value }): arr
配列の各要素を func の返り値で置き換えた後、1階層平坦化した新しい配列を作成します。
func は非同期的に呼び出されます。
let x = [1, 2, 3]
<: x.flat_map(@(v) {
return [v, v * 2]
})
@(v: arr).insert(index: num, item: value): null
【この操作は配列を書き換えます】
配列の index の位置に item を挿入します。
index が負の場合は末尾から数えます。
index が最後の要素より後の場合は末尾に追加します。
let x = [1, 2, 3, 4, 5]
// 3番目に6を挿入
x.insert(2, 6)
<: x
@(v: arr).remove(index: num): value | null
【この操作は配列を書き換えます】
配列から index の位置の要素を取り除き、その要素を返します。
index が負の場合は末尾から数えます。
index が最後の要素より後の場合は取り除かず、null
を返します。
let x = [1, 2, 6, 3, 4, 5]
// 3番目の要素を取り除く
let removed = x.remove(2)
<: removed
<: x
@(v: arr).every(func: @(item: value, index: num) { bool }): bool
配列の全ての要素に対して func が true を返す時のみ true 返します。空配列には常に true を返します。
let x = [2, 4, 6, 8, 10]
let y = [2, 4, 6, 7, 8]
@judgeAllEven(arr) {
if (arr.every(@(v) { return v % 2 == 0 })) {
return "配列の要素は全て偶数です"
} else {
return "配列の要素に奇数が含まれています"
}
}
<: judgeAllEven(x)
<: judgeAllEven(y)
@(v: arr).some(func: @(item: value, index: num) { bool }): bool
配列の要素に対して func が true を返す要素が存在する時のみ true 返します。
let x = [2, 4, 6, 7, 8]
@judgeHasOdd(arr) {
if (arr.some(@(v) { return v % 2 == 1 })) {
return "配列の要素に奇数が含まれています"
} else {
return "配列の要素は全て偶数です"
}
}
<: judgeHasOdd(x)
エラー型
#(v: error).name
型: str
エラーの識別子となる文字列を取得します。
#(v: error).info
型: value
エラーに付加情報がある場合、それを取得します。