[code 1]
01:
02:
03: immutable class POINT < $STR is
04: readonly attr x,y:FLT;
05:
06: create(x0,y0:FLT):SAME is
07: res:SAME;
08: res:=res.x(x0);
09: res:=res.y(y0);
10: return res;
11: end;
12:
13: is_eq(p:SAME):BOOL is
14: return x=p.x and y=p.y;
15: end;
16:
17: plus(p:SAME):SAME is
18: return #SAME(x+p.x, y+p.y);
19: end;
20:
21: minus(p:SAME):SAME is
22: return #SAME(x-p.x, y-p.y);
23: end;
24:
25: times(n:FLT):SAME is
26: return #SAME(x*n, y*n);
27: end;
28:
29: div(n:FLT):SAME is
30: return #SAME(x/n, y/n);
31: end;
32:
33: negate:SAME is
34: return #SAME(-x, -y);
35: end;
36:
37: abs:FLT is
38: return (x*x+y*y).sqrt;
39: end;
40:
41: rotate(theta:FLT):SAME is
42: theta := y.atan2(x)+theta;
43: return #SAME(self.abs*theta.cos, self.abs*theta.sin);
44: end;
45:
46: str:STR is
47: return "(" + x.str +"," + y.str +")";
48: end;
49: end;
50:
51: class MAIN is
52: const pi:FLT:= FLT::pi;
53: const fout:STR:="point.out";
54:
55: rz_polygon(a:ARRAY{POINT}, zoom, theta:FLT):ARRAY{POINT} is
56: a1:ARRAY{POINT}:=#(a.size);
57: loop
58: a1.set!(a.elt!.rotate(theta).times(zoom));
59: end;
60: return a1;
61: end;
62:
63: out2file(a0,a1:ARRAY{POINT}) is
64: f:FILE:=FILE::open_for_write(fout);
65: p0,p1:POINT;
66: i:INT;
67: loop
68: i:=(a0.size+1).times!;
69: if i = a0.size then i:=0; end;
70: p0:=a0[i];
71: p1:=a1[i];
72: f + p0.x + "\t" + p0.y + "\t" + p1.x + "\t" + p1.y + "\n";
73: end;
74: f.close;
75: end;
76:
77: main is
78: p0:POINT:=#(0.0,1.0);
79: a0:ARRAY{POINT}:=#(3);
80:
81: loop
82: a0.set!(p0.rotate(3.times!.flt*2.0*pi/3.0));
83: end;
84:
85: out2file(a0, rz_polygon(a0, 2.0, pi/12.0));
86:
87: end;
88: end;
結果を gnuplot で書き出すと 図1のようになります。

図 1:もともとの正三角形と2倍に拡大して 15 度回転した正三角形
3. 終わりに
immutable class は通常のクラスより効率的に処理されます。従って、たくさんのインスタンスを生成するクラスは immutable class に
したほうが速度面で有利になります。