====== state ======
State ist eine verifizierbare Behauptung und entspricht quasi einem Assert.
Im Gegensatz zu assert wird state allerdings als Garantie aufgefasst.
a is int[];
a += 1;
a += 2;
state a.size > 1;
Wir erklären hiermit, dass die Liste mehr als 1 Element besitzt ab der Stelle, in der das State-Element steht. Das ist zum einen eine Dokumentation, die im Debug-Modus verglichen werden kann und bemängelt werden kann, wenn sie nicht eingehalten wird, während sie im Release-Modus herausoptimiert wird.
State ist andererseits allerdings auch eine Festlegung einer Garantie.
func is code( ip is Point ptr )
{
state ip != null;
ip#.x : 1;
ip#.y : 2;
ip#.z : 3;
}
Hier darf auf ptr ohne Validate zugegriffen werden, weil der Entwickler Stein und Bein schwört, dass der übergebene Pointer valide ist. Wir sparen uns damit die Überprüfung. Das ergibt dann Sinn, wenn die Funktion von außerhalb gerufen wird und man die Prüfung explizit vermeiden möchte.
[[validate|Bevorzugen wäre hier jedoch]]
func is code( ip is Point ptr )
{
validate ip != null;
ip#.x : 1;
ip#.y : 2;
ip#.z : 3;
}
was denn Genesys-Compiler dazu auffordert, dass rufende Funktionen sicherstellen müssen, dass der erste Parameter != 0 ist.