![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Sather はそのほかに assert, invariant などの実行時安全ネットを用意しています。
これらの安全ネットを働かすかどうかはコンパイル時に決定することができます。 詳しくは sacomp man page をみてください。 大規模プログラムを作成するときにはどんなバグが潜んでいるか予期できないので、 なるべく安全ネットを働かせるようにしましょう。
create(n:INT):SAME pre n>=0 is
-- Create a new array of size `n' all of whose elements are void.
return new(n) end;
以下のコードは前に示した point.sa にセーフティネットをつけたものの一部です。
const eta:FLT:= 0.00001; -- 誤差の許容範囲 -- (中略) abs:FLT post result >=0.0 -- 長さが正であることを確認 is return (x*x+y*y).sqrt; end; rotate(theta:FLT):SAME post result.abs/abs > 1.0-eta and result.abs/abs < 1.0+eta -- 回転前後で原点からの距離の変化が is -- 許容範囲以内に収まっていることを確認 theta := y.atan2(x)+theta; return #SAME(self.abs*theta.cos, self.abs*theta.sin); end;
以下のコードも point.sa にセーフティネットをつけたものの一部です。
out2file(a0,a1:ARRAY{POINT}) pre a0.size > 0 and a1.size > 0 -- 配列の大きさが 0 より大きい事を前提とする。 is f:FILE:=FILE::open_for_write(fout); assert ~f.error; -- ファイルが開けなければ文句を言って終了 p0,p1:POINT; i:INT; loop i:=(a0.size+1).times!; if i = a0.size then i:=0; end; p0:=a0[i]; p1:=a1[i]; f + p0.x + "\t" + p0.y + "\t" + p1.x + "\t" + p1.y + "\n"; end; f.close; end;
$ sacomp -chk point2.sa -o point2
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |