/* complex0.kk , 1997, 4/17 */ /* complex の第0版 */ class Complex extends Object { local re, /* 実部 */ im; /* 虚部 */ def new2(a,b) { this = new(super.new0()); re = a; im = b; return(this); } def real() { return(re); } def imaginary() { return(im); } def operator add(b) { return( new2(re+b.real(), im+b.imaginary()) ); /* return( new0(re+b.real(), im+b.imaginary()) ); このようなエラーをしても, エラーがおきない. これは問題. */ /* 片方が, プリミティブオブジェクトでも大丈夫なように書き換える. 実は operator override の方法は数学の記述にはいまひとつなのでは? Mathematica は, 引数のデータ型を記述できるようになっている. でも, ! IsObject() で分類していけばいい. 引数を二つみて, つまり this, b の順に context を決めていくのは, 私の idea. */ } def operator sub(b) { return( new2(re-b.real(), im-b.imaginary()) ); } def operator mul(b) { return(new2( re*b.real()-im*b.imaginary(), re*b.imaginary()+im*b.real())); } def operator div(b) { local den,num1,num2; den = (b.real())^2 + (b.imaginary())^2 ; num1 = re*b.real() + im*b.imaginary(); num2 = -re*b.imaginary()+im*b.real(); return(new2(num1/den, num2/den)); /* den == 0 なら, isInvalidRational() がエラーをだすはず. このような, こと知らないと, プログラムを書けないのは良くない? */ } def void show() { Print(re); Print(" +I["); Print(im); Print("]"); } def void showln() { this.show(); Ln(); } }