Skip to content

組み込みプロパティ

組み込みプロパティとは、型ごとに用意された特殊な値あるいは関数です。
オブジェクトのプロパティのように.<name>の記法で呼び出すことができます。([<str>]の記法は使えません)

aiscript
// 例
'ai kawaii'.len //9

Core:range(0,2).push(4) //[0,1,2,4]

今の所、数値・文字列・配列・エラー型に対応するものが用意されています。オブジェクトのそれに相当するものは、記法との兼ね合いでstd関数として実装されています。

書式

本ページでは、(型名)型の任意の値に対する組み込みプロパティを下記のような形式で表記します。

#(v: 型名).プロパティ名

または

@(v: 型名).組み込みメソッド名(引数リスト): 返り値の型

#から始まるものは関数以外の値を持つ組み込みプロパティです。
@から始まるものは関数の組み込みプロパティ(組み込みメソッド)です。

数値

@(x: num).to_str(): str

数値を文字列に変換します。

aiscript
let x = 123
<: x.to_str()

@(x: num).to_hex(): str

数値から16進数の文字列を生成します。

aiscript
let x = 123
<: x.to_hex()

文字列

#(v: str).len

型: num
文字列の長さを取得します。

aiscript
let x = "Hello World!"
<: x.len

@(v: str).to_num(): num | null

文字列が数字であれば、数値に変換します。

aiscript
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 番目の文字を取得します。

aiscript
let x = "Hello World!"

<: x.pick(6)

@(v: str).incl(keyword: str): bool

文字列中に keyword が含まれていればtrue、なければfalseを返します。

aiscript
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_indexv.lenより大きいか-v.lenより小さい場合はfalseを返します。
start_index が負の場合は末尾から数えます。

aiscript
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_indexv.lenより大きいか-v.lenより小さい場合はfalseを返します。
end_index が負の場合は末尾から数えます。

aiscript
let x = "Hello World!"

<: x.ends_with("World!")
<: x.ends_with("Hello", 5)

@(v: str).slice(begin: num, end: num): str

文字列の begin 番目から end 番目の直前までの部分を取得します。

aiscript
let x = "Hello World!"

<: x.slice(6, 11)

@(v: str).split(splitter?: str): arr<str>

文字列を splitter がある場所で区切り、配列にしたものを返します。
splitter が与えられなければ一文字づつ区切ります。

aiscript
let x = "Hey, how are you?"

<: x.split()
<: x.split(",")

@(v: str).replace(old: str, new: str): str

文字列中の oldnew に置換したものを返します。

aiscript
let x = "Hello World!"

<: x.replace("World", "Ai-Chan")

@(v: str).index_of(search: str, fromIndex?: num): num

文字列中から search を探し、その添字を返します。
fromIndex が指定されていれば、その位置から検索を開始します。
fromIndex が負値の時は末尾からの位置(文字列の長さ+fromIndex)が使用されます。
該当が無ければ-1を返します。

aiscript
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 の末尾が切り捨てられます。

aiscript
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 の末尾が切り捨てられます。

aiscript
let x = "5"

<: `I want {x.pad_end(4, "0")} yen`

@(v: str).trim(): str

文字列の前後の空白を取り除いたものを返します。

aiscript
let x = "  Hello World!  "

<: x.trim()

@(v: str).upper(): str

文字列中の英字を大文字に変換して返します。

aiscript
let x = "Hello World!"

<: x.upper()

@(v: str).lower(): str

文字列中の英字を小文字に変換して返します。

aiscript
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
配列の要素数を取得します。

aiscript
let x = [1, 2, 3, 4, 5]

<: x.len

@(v: arr).at(index: num, otherwise?: value): value

配列の index の位置の要素を返します。
index が負の場合は末尾から数えます。
index が範囲外の場合は、代わりに otherwise を返します。
otherwise が省略されている場合はnullになります。

aiscript
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

【この操作は配列を書き換えます】
配列の最後に要素を追加します。

aiscript
let x = [1, 2, 3, 4, 5]

x.push(8)
<: x

@(v: arr).unshift(i: value): null

【この操作は配列を書き換えます】
配列の最初に要素を追加します。

aiscript
let x = [1, 2, 3, 4, 5]

x.unshift(7)
<: x

@(v: arr).pop(): value

【この操作は配列を書き換えます】
配列の最後の要素を取り出します。

aiscript
let x = [1, 2, 3, 4, 5]

let popped = x.pop()
<: popped
<: x

@(v: arr).shift(): value

【この操作は配列を書き換えます】
配列の最初の要素を取り出します。

aiscript
let x = [1, 2, 3, 4, 5]

let shifted = x.shift()
<: shifted
<: x

@(a: arr).concat(b: arr): arr

配列を連結します。

aiscript
let x = [1, 2, 3]
let y = [4, 5, 6]

<: x.concat(y)

// 元の配列は変更されません
<: x
<: y

@(v: arr<str>).join(joiner?: str): str

文字列の配列を結合して一つの文字列として返します。

aiscript
let x = ["Hello", "World", "!"]

<: x.join(" ")

// 引数を省略するとそのまま連結されます
<: x.join()

@(v: arr).slice(begin: num, end: num): arr

配列の begin 番目から end 番目の部分を切り出して返します。

aiscript
let x = [1, 2, 3, 4, 5]

<: x.slice(1, 4)

@(v: arr).incl(i: value): bool

配列に指定した値が含まれているかどうかを返します。

aiscript
let x = [1, 2, 3, 4, 5]

<: x.incl(3)
<: x.incl(6)

@(v: arr).map(func: fn): arr

配列の各要素に対し func を非同期的に呼び出します。 それぞれの要素を func の返り値で置き換えたものを返します。

aiscript
let x = ['田中', '鈴木', '山本']

<: x.map(@(v) {
    return `{v}さん`
})

@(v: arr).filter(func: fn): arr

配列の要素のうち func が true を返すようなもののみを抜き出して返します。
順序は維持されます。

aiscript
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 を指定しておくことが推奨されています。

aiscript
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 を返すような要素を探し、その値を返します。

aiscript
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を返します。

aiscript
let x = [1, 2, 3, 4, 5]

<: x.index_of(3)

@(v: arr).reverse(): null

【この操作は配列を書き換えます】
配列を反転させます。

aiscript
let x = [1, 2, 3, 4, 5]

x.reverse()

<: x

@(v: arr).copy(): arr

配列のコピーを生成します。
シャローコピーであり、配列やオブジェクトの参照は維持されます。

aiscript
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 として次のような比較関数を渡します。
安定ソートです。

  • ab より順番的に前の時、負の値を返す
  • ab より順番的に後の時、正の値を返す
  • ab と順番的に同等の時、0を返す

数値の並び替えではCore:subを渡すことで昇順、@(a,b){b-a}を渡すことで降順ソートができます。
文字列用の比較関数としてStr:lt(昇順), Str:gt(降順)が用意されています。詳しくはstd.mdをご覧下さい。

aiscript
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に準拠します。

aiscript
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以上の整数値を指定します。それ以外ではエラーになります。

aiscript
let x = [1, 2, 3]

<: x.repeat(3)

@(v: arr).splice(index: num, remove_count?: num, items?: arr&lt;value>): arr&lt;value>

【この操作は配列を書き換えます】
配列の index から remove_count 個の要素を取り除き、その位置に items の要素を挿入します。
返り値として、取り除いた要素の配列を返します。
index が負の場合は末尾から数えます。
index が最後の要素より後の場合は要素を取り除かず、挿入は末尾に追加します。
remove_count を省略した場合、末尾まで取り除きます。
items を省略した場合、何も挿入しません。

aiscript
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になります。

aiscript
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 は非同期的に呼び出されます。

aiscript
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 が最後の要素より後の場合は末尾に追加します。

aiscript
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を返します。

aiscript
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 を返します。

aiscript
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 返します。

aiscript
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
エラーに付加情報がある場合、それを取得します。