![]() |
![]() |
![]() |
![]() |
![]() |
オペレータの構文糖衣がかぶさるメソッドはあらかじめ定義されているので、 自分のクラスでそのメソッドを定義することによってオペレータを再定義することができます。
メソッド | オペレータ |
---|---|
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左側に示すオペレータは自動的に右側のメソッドに変換されます。
オペレータ | メソッドを使った記述 |
---|---|
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) |
メソッド | 構文糖衣 |
---|---|
b := a.aget(i) | b := a[i] |
a.aset(i, b) | a[i] := b |
一方、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;
![]() |
![]() |
![]() |
![]() |
![]() |