
Kuinの演算子
Kuinにおける演算子と優先順位はKuinの演算子の通りです。
優先順位 | 結合 | 演算子 | 説明 |
---|---|---|---|
1 | 左 | f() | 関数呼び出し |
a[] | 配列参照 | ||
a.b | メンバ参照 | ||
a $ t | キャスト | ||
a $> t | バイナリ符号化 | ||
a $< t | バイナリ復号化 | ||
2 | 右 | a ^ b | 冪 |
3 | 右 | +a -a |
符号 |
!a | 論理否定 | ||
^a | 要素数演算子 | ||
#t | インスタンス生成 | ||
##a | ディープコピー | ||
4 | 左 | a * b | 乗算 |
a / b | 除算 | ||
a % b | 剰余 | ||
5 | 左 | a + b | 加算 |
a - b | 減算 | ||
6 | 左 | a ~ b | 配列連結 |
7 | 左 | a = b a <> b a < b a > b a <= b a >= b |
比較演算子 |
a =& b a <>& b |
参照比較演算子 | ||
a =$ t a <>$ t |
型比較演算子 | ||
8 | 左 | a & b | 論理積 |
9 | 左 | a | b | 論理和 |
10 | 右 | a ?(b, c) | 条件演算子 |
11 | 右 | a :$ b | スワップ演算子 |
a :: b a :+ b a :- b a :* b a :/ b a :% b a :^ b a :~ b |
代入演算子 |
それぞれの演算子について、以下で詳しく説明します。
関数呼び出し
関数を呼び出す演算子です(関数呼び出しの構文)。
関数名(引数1, 引数2, ...) |
関数呼び出しの仕様は関数呼び出しの仕様の通りです。
- 関数型の値の後に「(引数の式1, 引数の式2, ...)」を付けると、その関数が呼び出され、戻り値がある場合はその値が返る。
- 引数を参照渡しするときには、引数の前に「&」をつけなければならない。
- 関数に渡す引数の型および個数は、関数で定義されている引数の型および個数と一致していなければならない。
- 引数の式は、関数が呼び出される直前に左から順番に評価される。
配列参照
配列の要素を参照する演算子です(配列参照の構文)。
配列名[要素番号] |
配列参照の仕様は配列参照の仕様の通りです。
- intの値「n」を用いて、配列の値の後に「[n]」を付けると、配列のn番目の要素が返る。
- このとき、nは0以上かつ要素数未満でなければならない。 nがこの範囲外だった場合、デバッグ実行時に例外(E9170002)が発生する。
メンバ参照
値のメンバを参照する演算子です(メンバ参照の構文)。
値.メンバ名 |
メンバ参照の仕様はメンバ参照の仕様の通りです。
- 任意の型の値の後に「.メンバ名」を付けると、その型に定義されているメンバが返る。
キャスト
値を指定した型に変換する演算子です(キャストの構文)。
値 $ 型名 |
キャストの仕様はキャストの仕様の通りです。
- 任意の型の値の後に「$ 型名」を付けると、その型に変換された値が返る。
- クラスのインスタンスを、そのクラスおよびその親クラス以外の型にキャストすると、実行時に例外(E9170001)が発生する。
変換できる型には制約があり、キャストできる型の通りです。
変換前の型 | 変換できる型 |
---|---|
int | int、float、char、bool、ビット型、列挙型 |
float | int、float、ビット型 |
char | int、char、ビット型 |
bool | int、bool、ビット型 |
ビット型 | int、float、char、bool、ビット型、列挙型 |
列挙型 | int、ビット型、列挙型 |
クラス | クラス |
バイナリ符号化
値を、[]bit8型のバイナリ列に変換する演算子です(バイナリ符号化の構文)。
値 $> []bit8 |
バイナリ符号化の仕様はバイナリ符号化の仕様の通りです。
- 任意の型の値の後に「$> []bit8」を付けると、バイナリ列に変換された値が返る。 型名に[]bit8以外を指定することはできない。
- 値のみをバイナリ化するため、2つの変数が同じ参照を保持していた場合などには参照関係は失われる。
- 関数型をバイナリ化すると、「$<」演算子で復元したときにnullになるような値に変換される。
バイナリ復号化
バイナリ符号化演算子によって変換された[]bit8型のバイナリ列を、値に復元する演算子です(バイナリ復号化の構文)。
値 $< 型名 |
バイナリ復号化の仕様はバイナリ復号化の仕様の通りです。
- バイナリ列に変換された値の後に「$< 型名」を付けると、バイナリ列に変換される前の値が返る。
- 型名にはバイナリ符号化演算子によって変換される前の型を指定しなければならない。
- 特に、クラスのインスタンスを復元するときは、親クラスの型ではなく、復元前のインスタンスの型を指定しなければならない。
冪
aのb乗を計算する演算子です(冪の構文)。
a ^ b |
冪の仕様は冪の仕様の通りです。
- intもしくはfloatの2つの値「a」「b」に対し、「a ^ b」とすると、aのb乗の値が返る。
- aとbの型は等しくなければならず、演算結果はその型で返る。
- aとbが両方とも0のとき、1を返す。
設計の理由
この演算子「^」はBASICに由来します。 日常的に使われるほど身近な演算ですので、演算子として直感的に書けたほうが良いと考え採用しました。符号
プラスやマイナスの符号を表す演算子です(符号の構文)。
+値 -値 |
符号の仕様は符号の仕様の通りです。
- int、float、ビット型の値の前に「+」を付けると、そのままの値が返る。
- int、float、ビット型の値の前に「-」を付けると、正負を反転させた値が返る。
- コンパイル時に定数になる値への演算の場合、コンパイル時に演算されて結果も定数になることが保証される。
論理否定
真偽を反転させる演算子です(論理否定の構文)。
!値 |
論理否定の仕様は論理否定の仕様の通りです。
- boolの値の前に「!」を付けると、真偽を反転させた値が返る。
- コンパイル時に定数になる値への演算の場合、コンパイル時に演算されて結果も定数になることが保証される。
要素数演算子
配列などの要素数を取得する演算子です(要素数演算子の構文)。
^値 |
要素数演算子の仕様は要素数演算子の仕様の通りです。
- 配列、list、stack、queue、dictの前に「^」を付けると、要素数がint型で返る。 これらの型の値は内部に要素数を保持しているため、この演算は高速に行われる。
インスタンス生成
クラスなどのインスタンスを生成する演算子です(インスタンス生成の構文)。
#型名 |
インスタンス生成の仕様はインスタンス生成の仕様の通りです。
- list、stack、queue、dict、クラスの型名の前に「#」を付けると、それらのインスタンスが生成されて返る。
- 任意の型名の前に「#[要素数1, 要素数2, ..., 要素数n]」を付けると、その型名を要素とするn次元配列のインスタンスが生成されて返る。
例えば、「#[3,2]int」とすると、3×2の要素の「[][]int」型の2次元配列が返ります。
ディープコピー
インスタンスをディープコピー(参照ではなく値を複製)する演算子です(インスタンス生成の構文)。
##値 |
ディープコピーの仕様はディープコピーの仕様の通りです。
- 配列、list、stack、queue、dict、クラスの値の前に「##」を付けると、その値が別のメモリ領域にコピーされ、その参照が返る。
設計の理由
参照のコピーではなく中身のコピーを行いたいことは多いですが、これを用意している言語は意外と少なくユーザ側でコピー処理を実装する必要があったため、Kuinでは標準で用意しました。乗算
a,mul,bを計算する演算子です(乗算の構文)。
a * b |
乗算の仕様は乗算の仕様の通りです。
- int、float、ビット型のいずれかの2つの値「a」「b」に対し、「a * b」とすると、a,mul,bの値が返る。
- aとbの型は等しくなければならず、演算結果はその型で返る。
- コンパイル時に定数になる値同士の演算の場合、コンパイル時に演算されて結果も定数になることが保証される。
除算
a,div,bを計算する演算子です(除算の構文)。
a / b |
除算の仕様は除算の仕様の通りです。
- int、float、ビット型のいずれかの2つの値「a」「b」に対し、「a / b」とすると、a,div,bの値が返る。
- aとbの型は等しくなければならず、演算結果はその型で返る。
- intもしくはビット型の演算で、bが0のとき、コンパイルエラーもしくは例外が発生する。
- floatの演算で、aとbが両方とも0.0のとき、コンパイルエラーもしくは例外が発生する。
- コンパイル時に定数になる値同士の演算の場合、コンパイル時に演算されて結果も定数になることが保証される。
剰余
a,div,bの余りを計算する演算子です(剰余の構文)。
a % b |
剰余の仕様は剰余の仕様の通りです。
- int、float、ビット型のいずれかの2つの値「a」「b」に対し、「a % b」とすると、a,div,bの余りの値が返る。
- aとbの型は等しくなければならず、演算結果はその型で返る。
- intもしくはビット型の演算で、bが0のとき、コンパイルエラーもしくは例外が発生する。
- floatの演算で、aとbが両方とも0.0のとき、コンパイルエラーもしくは例外が発生する。
- コンパイル時に定数になる値同士の演算の場合、コンパイル時に演算されて結果も定数になることが保証される。
加算
a,add,bを計算する演算子です(加算の構文)。
a + b |
加算の仕様は加算の仕様の通りです。
- int、float、ビット型のいずれかの2つの値「a」「b」に対し、「a + b」とすると、a,add,bの値が返る。
- aとbの型は等しくなければならず、演算結果はその型で返る。
- コンパイル時に定数になる値同士の演算の場合、コンパイル時に演算されて結果も定数になることが保証される。
減算
a,sub,bを計算する演算子です(減算の構文)。
a - b |
減算の仕様は減算の仕様の通りです。
- int、float、ビット型のいずれかの2つの値「a」「b」に対し、「a - b」とすると、a,sub,bの値が返る。
- aとbの型は等しくなければならず、演算結果はその型で返る。
- コンパイル時に定数になる値同士の演算の場合、コンパイル時に演算されて結果も定数になることが保証される。
配列連結
2つの配列を連結する演算子です(配列連結の構文)。
a ~ b |
配列連結の仕様は配列連結の仕様の通りです。
- 配列の2つの値「a」「b」に対し、「a ~ b」とすると、aとbを連結した配列が新規のメモリ領域に確保されて返る。
- aとbの型は等しくなければならない。
- aもしくはbがnullのとき、コンパイルエラーもしくは実行時に例外が発生する。
- コンパイル時に定数になる値同士の演算の場合、コンパイル時に演算されて結果も定数になることが保証される。
設計の理由
この演算子「~」はD言語に由来します。 JavaやC#で見られる「+」では数値の加算と曖昧になり、PHPの「.」ではメンバの呼び出しと曖昧になりますので「~」を採用しました。比較演算子
2つの値を比較する演算子です(比較演算子の構文)。
a = b a <> b a < b a > b a <= b a >= b |
比較演算子の仕様は比較演算子の仕様の通りです。
- 比較可能な2つの値「a」「b」に対し、「a = b」「a <> b」「a < b」「a > b」「a <= b」「a >= b」のいずれかを行うと、値の比較結果がboolで返る。
- 比較可能な型とは、「a < b」「a > b」「a <= b」「a >= b」の場合はint、float、char、ビット型、[]char、列挙型、クラスで、「a = b」「a <> b」の場合はこれらにboolが加わる。 nullは比較できない。
- aとbの型は等しくなければならない。
- 「a = b」「a < b」「a > b」「a <= b」「a >= b」は数学における比較と同様の意味となる。 「a <> b」は数学における「a,neq,b」に相当する。
- コンパイル時に定数になる値同士の演算の場合、コンパイル時に演算されて結果も定数になることが保証される。
設計の理由
不一致の演算子「<>」はBASIC、Pascal、SQLなどで見られるものです。 演算子の1文字目を読み込んだ時点で優先順位が決定できるとコンパイルが速く行えるため、1文字目が「!」と重複する「!=」ではなく「<>」を採用しました。参照比較演算子
2つの参照を比較する演算子です(参照比較演算子の構文)。
a =& b a <>& b |
参照比較演算子の仕様は参照比較演算子の仕様の通りです。
- 配列、list、stack、queue、dict、クラス、func、nullのいずれかの2つの値「a」「b」に対し、「a =& b」「a <>& b」を行うと、それぞれ「参照が等しいか否か」「参照が異なるか否か」がboolで返る。
- aとbの型は等しくなければならない。
型比較演算子
クラスのインスタンスが指定したクラスの型もしくはその親クラスの型かどうかを判定する演算子です(型比較演算子の構文)。
インスタンス =$ 型名 インスタンス <>$ 型名 |
型比較演算子の仕様は型比較演算子の仕様の通りです。
- クラスの値「a」に対し、クラスの型「t」を指定して「a =$ t」「a <>$ t」を行うと、それぞれ「そのクラスもしくは親クラスの型であるか否か」「そのクラスもしくは親クラスの型でないか否か」がboolで返る。
クラスは継承した子クラスのインスタンスを継承元の親クラスの変数に代入できるため、代入されているインスタンスがどの型であるかを調べるのにこの演算子を使います。
論理積
論理積を計算する演算子です(論理積の構文)。
a & b |
論理積の仕様は論理積の仕様の通りです。
- boolの2つの値「a」「b」に対し、「a & b」とすると、aとbが共にtrueのときにtrueが返り、それ以外のときはfalseが返る。
- aがfalseだった段階で結果がfalseであることが確定するため、aがfalseのときはbの式の評価がスキップされる。
- コンパイル時に定数になる値同士の演算の場合、コンパイル時に演算されて結果も定数になることが保証される。
論理和
論理和を計算する演算子です(論理和の構文)。
a | b |
論理和の仕様は論理和の仕様の通りです。
- boolの2つの値「a」「b」に対し、「a | b」とすると、aとbが共にfalseのときにfalseが返り、それ以外のときはtrueが返る。
- aがtrueだった段階で結果がtrueであることが確定するため、aがtrueのときはbの式の評価がスキップされる。
- コンパイル時に定数になる値同士の演算の場合、コンパイル時に演算されて結果も定数になることが保証される。
条件演算子
真偽に応じて値を返す演算子です(条件演算子の構文)。
条件 ?(真のときの値, 偽のときの値) |
条件演算子の仕様は条件演算子の仕様の通りです。
- boolの値「a」と任意の型の2つの値「b」「c」に対し、「a ?(b, c)」とすると、aがtrueのときにはbが、aがfalseのときにはcが返る。
- 「?」と「(」の間にスペースを入れてはならない。
- bとcの型は等しくなければならない。
- bとcのうち、返らなかったほうの式は評価がスキップされる。
- コンパイル時に定数になる値同士の演算の場合、コンパイル時に演算されて結果も定数になることが保証される。
設計の理由
この演算子「?(,)」はC言語に由来します。 C言語では「?:」ですが、式が長くなったり複数の「?:」を組み合わせた場合に優先順位が解りにくくなるため、明示的な括弧を用意して「?(,)」としました。 「?」と「(」の間にスペースを入れてはならない仕様にしたのは、この間が離れると、数式の括弧と混同しやすくなるためです。スワップ演算子
2つの変数の値を入れ替える演算子です(スワップ演算子の構文)。
a :$ b |
スワップ演算子の仕様はスワップ演算子の仕様の通りです。
- 任意の型の2つの変数「a」「b」に対し、「a :$ b」とすると、aとbに格納されている値(参照型の場合は参照)が入れ替わる。
- aとbの型は等しくなければならない。
- この演算子は値を返さない。
設計の理由
2つの変数の中身を入れ替える処理はよく行われますが、これを演算子や標準ライブラリで用意している言語がなぜかほとんど無かったため、Kuinでは用意しました。代入演算子
変数に値を代入する演算子です(代入演算子の構文)。
a :: b a :+ b a :- b a :* b a :/ b a :% b a :^ b a :~ b |
代入演算子の仕様は代入演算子の仕様の通りです。
- 任意の型の変数「a」と値「b」に対し、「a :: b」とすると、aにbが代入される。
- aとbの型は等しくなければならない。
- この演算子は値を返さない。
- 「a :+ b」は「a :: a + b」に等しい。 同様に、「a :- b」「a :* b」「a :/ b」「a :% b」「a :^ b」「a :~ b」はいずれも「a :: a 演算子 b」に等しい。