HOME Sather を試そう 書き込む

9. オペレーター


1. はじめに

Sather のオペレータは実はメソッドの構文糖衣です。これによって、Sather のコードは見た目は C に似たものになり、可読性が向上しています。

オペレータの構文糖衣がかぶさるメソッドはあらかじめ定義されているので、 自分のクラスでそのメソッドを定義することによってオペレータを再定義することができます。

2. 算術オペレータ

表1に挙げるメソッドは算術オペレータの構文糖衣が使えます。

表1:算術オペレータの構文糖衣が使えるメソッド
メソッド オペレータ
a.plus(b) a + b
a.minus(b) a - b
a.times(b) a * b
a.div(b) a / b
a.pow(b) a ^ b
a.mod(b) a % b
a.is_lt(b) a < b
a.is_eq(b) a = b
-a a.negate
~a a.not

また、表2左側に示すオペレータは自動的に右側のメソッドに変換されます。

表2:メソッドを使った記述に変換されるその他の算術オペレータ
オペレータ メソッドを使った記述
a <= b b.is_lt(a).not
a >= b a.is_lt(b).not
a /= b a.is_eq(b).not
a > b b.is_lt(a)

3. 配列の要素に対する参照と代入

配列の要素に対する参照と代入はそれぞれ aget, aset メソッドで行います。これらのメソッドには表3に示すような構文糖衣が使えます。

表3:配列の要素に対する参照と代入のメソッドとその構文糖衣
メソッド 構文糖衣
b := a.aget(i) b := a[i]
a.aset(i, b) a[i] := b

4. 演算子の再定義

自前のクラスに is_eq, plus, minus, aget, aset, ... などのメソッドを定義すれば、演算子を再定義することができます。 例えば、STR 型では plus が再定義されていて、文字列に変換できるものなら何でも付け加えることができます。

一方、INT 型にも aget と aset が定義されていてビットの値を参照したり代入したりできます。 例えば、crypt.sa では bxor を使って INT のビットごとの XOR をとっていますが、 あのプログラムで使っている INT 型は CHAR から変換されたものなので、8 bit まで XOR をとれば済みます。 bxor は 32 bit まで XOR をとるので無駄な動作をしているといえます。無駄な動作をしないように crypt.sa を書き換えると 以下のようになります。

-- 64 行目の     fs := fs + s.elt!.int.bxor(key_rotate!).char;    を次のように書き換える。
	 fs := fs + cxor(s.elt!.int,key_rotate!);

-- 次のメソッドを class XOR に追加する
   private cxor(m,n:INT):CHAR is
      i,k:INT;
      loop
	 i:=CHAR::asize.times!;                -- 8.times!
	 k:=k.aset(i, m[i].xor(n[i]));
      end;
      return k.char;
   end;

5. 終わりに

Sather も他のオブジェクト指向言語と同様にオペレータを再定義することができます。
直感的に分かりやすい適切な再定義を行うとコードの可読性が高まります。

HOME Sather を試そう 書き込む