sic dokumentiert ungewöhnliche Konstrukte, die ansonsten in einer Warning enden:
// statt operator(=) = code( mutable lhs, rhs as Integer )
operator(=) = code( lhs, rhs as mutable Integer ) -> lhs
{
lhs.Value = rhs.Value;
rhs.copied++;
}
führt zu einer Warning: rhs sollte keine mutable Reference sein, die modifiziert werden kann. Hier will man das aber offenbar so (obwohl man copied als mutable, bzw. friend deklarieren sollte)
operator(=) = code( sic( lhs, rhs as mutable Integer ) ) -> lhs
operator(=) sucht nach Fehlern in der Aufrufliste, um Hinweise und Warnings abzugeben. sic wertet den geklammerten Ausdruck aus und setzt ein Bit, dass hier nicht weiter nach Warnings oder Hints gesucht werden soll. Sofern kein Fehler vorliegt, akzeptiert der Compiler den Ausdruck ohne weiteren Kommentar. Sic selbst setzt nach der Auswertung des geklammerten (bzw. ohne Klammern nachfolgenden) Ausdrucks nur das Bit und gibt den nachfolgenden Ausdruck direkt zurück.
Wenn der Compiler nicht mitbekommt, dass eine Variable initialisiert ist:
[code] f( x is bool ) := {
a is int;
x then a = 0;
// a ist nicht garantiert initialisiert
bla();
x then
{
print a$; // Fehler, da a nicht garantiert initialisiert wurde. Der Entwickler weiß aber, dass a hier
// initialisiert sein muss.
print sic(a)$; // a ist so akzeptiert.
}
} [/code]