Home English

Kuina-chan

くいなちゃんAug 22, 2017


プログラミング言語Kuin」の演算子についてです。

Kuinの演算子

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がこの範囲外だった場合、デバッグ実行時に例外(C9170002)が発生する。
配列参照の仕様

メンバ参照

値のメンバを参照する演算子です(メンバ参照の構文)。
メンバ参照の構文

 .メンバ名

メンバ参照の仕様はメンバ参照の仕様の通りです。
  • 任意の型の値の後に「.メンバ名」を付けると、その型に定義されているメンバが返る。
メンバ参照の仕様

キャスト

値を指定した型に変換する演算子です(キャストの構文)。
キャストの構文

  $ 型名

キャストの仕様はキャストの仕様の通りです。
  • 任意の型の値の後に「$ 型名」を付けると、その型に変換された値が返る。
  • クラスのインスタンスを、そのクラスおよびその親クラス以外の型にキャストすると、実行時に例外(C9170001)が発生する。
キャストの仕様
変換できる型には制約があり、キャストできる型の通りです。
キャストできる型
変換前の型 変換できる型
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の型は等しくなければならず、演算結果はその型で返る。
べき乗の仕様
設計の理由
 この演算子「^」は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×bを計算する演算子です(乗算の構文)。
乗算の構文

 a * b

乗算の仕様は乗算の仕様の通りです。
  • int、float、ビット型のいずれかの2つの値「a」「b」に対し、「a * b」とすると、a×bの値が返る。
  • aとbの型は等しくなければならず、演算結果はその型で返る。
  • コンパイル時に定数になる値同士の演算の場合、コンパイル時に演算されて結果も定数になることが保証される。
乗算の仕様

除算

a÷bを計算する演算子です(除算の構文)。
除算の構文

 a / b

除算の仕様は除算の仕様の通りです。
  • int、float、ビット型のいずれかの2つの値「a」「b」に対し、「a / b」とすると、a÷bの値が返る。
  • aとbの型は等しくなければならず、演算結果はその型で返る。
  • intもしくはビット型の演算で、bが0のとき、コンパイルエラーもしくは例外が発生する。
  • コンパイル時に定数になる値同士の演算の場合、コンパイル時に演算されて結果も定数になることが保証される。
除算の仕様

剰余

a÷bの余りを計算する演算子です(剰余の構文)。
剰余の構文

 a % b

剰余の仕様は剰余の仕様の通りです。
  • int、float、ビット型のいずれかの2つの値「a」「b」に対し、「a % b」とすると、a÷bの余りの値が返る。
  • aとbの型は等しくなければならず、演算結果はその型で返る。
  • intもしくはビット型の演算で、bが0のとき、コンパイルエラーもしくは例外が発生する。
  • コンパイル時に定数になる値同士の演算の場合、コンパイル時に演算されて結果も定数になることが保証される。
剰余の仕様

加算

a+bを計算する演算子です(加算の構文)。
加算の構文

 a + b

加算の仕様は加算の仕様の通りです。
  • int、float、ビット型のいずれかの2つの値「a」「b」に対し、「a + b」とすると、a+bの値が返る。
  • aとbの型は等しくなければならず、演算結果はその型で返る。
  • コンパイル時に定数になる値同士の演算の場合、コンパイル時に演算されて結果も定数になることが保証される。
加算の仕様

減算

a-bを計算する演算子です(減算の構文)。
減算の構文

 a - b

減算の仕様は減算の仕様の通りです。
  • int、float、ビット型のいずれかの2つの値「a」「b」に対し、「a - b」とすると、a-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≠b」に相当する。
  • コンパイル時に定数になる値同士の演算の場合、コンパイル時に演算されて結果も定数になることが保証される。
比較演算子の仕様
設計の理由
 不一致の演算子「<>」はBASIC、Pascal、SQLなどで見られるものです。 演算子の1文字目を読み込んだ時点で優先順位が決定できるとコンパイルが速く行えるため、1文字目が「!」と重複する「!=」ではなく「<>」を採用しました。

参照比較演算子

2つの値の参照を比較する演算子です(参照比較演算子の構文)。
参照比較演算子の構文

 a =& b
 a <>& b

参照比較演算子の仕様は参照比較演算子の仕様の通りです。
  • 配列、list、stack、queue、dict、クラス、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」に等しい。
代入演算子の仕様
設計の理由
 代入演算子「::」はKuinの最も風変わりな設計の一つですが、これはPascalの代入演算子「:=」に由来します。 演算子の1文字目を読み込んだ時点で優先順位が決定できるとコンパイルが速く行えるため、1文字目が「=」と重複する「==」ではなく、かつ「:=」より入力が容易な「::」に決定しました。
1503413318ja