====== Lyx – Bedingungen (if / else / match) ======
Bedingungen steuern den Kontrollfluss in Lyx. Sie erlauben es, Codeblöcke nur dann auszuführen, wenn eine bestimmte logische Voraussetzung erfüllt ist.
→ [[lyx_-_programmiersprache:schleifen|Schleifen]] · [[lyx_-_programmiersprache:pattern-matching|Pattern Matching]] · [[lyx_-_programmiersprache:syntax|Sprachsyntax]]
----
===== 1. Grundlegende Syntax =====
Eine ''if''-Bedingung erwartet einen Ausdruck, der zu ''bool'' oder ''qbool'' evaluiert.
if (altitude < 1000) {
ActivateLandingGear();
} else if (altitude > 40000) {
ReduceThrust();
} else {
MaintainFlight();
}
* **Klammern**: Die Bedingung muss in runden Klammern stehen.
* **Blöcke**: Geschweifte Klammern ''{ }'' sind auch bei einzeiligen Anweisungen Pflicht.
* **Vergleich**: Lyx verwendet ''='' für Gleichheit (nicht ''=='') und '':='' für Zuweisung. So ist eine versehentliche Zuweisung in einer Bedingung strukturell unmöglich.
var speed: int64 := 250;
if (speed = 250) {
PrintStr("Reisegeschwindigkeit\n");
}
// Ungleich
if (speed != 0) {
PrintStr("Flugzeug bewegt sich\n");
}
// Kleiner/größer
if (speed > 300 | speed < 50) {
PrintStr("Außerhalb Normalbereich\n");
}
----
===== 2. Logische Operatoren =====
^ Operator ^ Bedeutung ^ Beispiel ^
| ''&'' | UND (AND) | ''a > 0 & b > 0'' |
| ''|'' | ODER (OR) | ''a = 0 | b = 0'' |
| ''!'' | NICHT (NOT) | ''!(a > 0)'' |
| ''!='' | Ungleich | ''a != b'' |
> **Lyx verwendet ''&'' und ''|'' — nicht ''&&'' und ''||''.** Beide Seiten werden immer ausgewertet (keine Short-Circuit-Evaluation per Default). Für Short-Circuit-Auswertung: Bedingungen in separate ''if''-Blöcke verschachteln.
import std.io;
fn Check(x: int64, y: int64): void {
// Beide Operanden werden immer ausgewertet
if (x > 0 & y > 0) {
PrintStr("beide positiv\n");
}
if (x < 0 | y < 0) {
PrintStr("mindestens eines negativ\n");
}
if (!(x = y)) {
PrintStr("ungleich\n");
}
}
fn main(): int64 {
Check(3, 5);
Check(-1, 2);
Check(4, 4);
return 0;
}
==== Nullable-Prüfung mit nil ====
Lyx verwendet ''nil'' (nicht ''null'') für den Abwesenheitswert optionaler Typen:
// Optionaler Sensor — kann nil sein
var sensor: ^SensorData := nil;
// Erst auf nil prüfen, dann zugreifen
if (sensor != nil) {
ProcessData(sensor^.value);
}
// Alternativ: Nil-Koaleszenz-Operator
var safe_sensor: ^SensorData := sensor ?? ^DefaultSensor;
> In DAL-A/B-Code sollten optionale Pointer durch typsichere ''result''-Rückgaben ersetzt werden — ''nil''-Checks sind fehleranfällig und schwer zu analysieren.
----
===== 3. Kurzform: if als Ausdruck =====
''if'' kann als Ausdruck verwendet werden, wenn beide Zweige denselben Typ zurückgeben:
fn Abs(x: int64): int64 {
return if (x < 0) { -x } else { x };
}
fn ClampLabel(v: int64): pchar {
return if (v < 0) { "negativ" } else if (v = 0) { "null" } else { "positiv" };
}
----
===== 4. Probabilistisches if (qbool) =====
Lyx unterstützt den Typ ''qbool'' für probabilistische Logik — z.B. für Energie-Aware-Entscheidungen oder Wahrscheinlichkeits-Simulationen.
// 1% Ausfallwahrscheinlichkeit
var failure_prob: qbool := 0.01q;
if (failure_prob) {
// Dieser Block wird mit ~1% Wahrscheinlichkeit ausgeführt
TriggerEmergencyRoutine();
}
''qbool'' ist kein Ersatz für normale Bedingungen in Safety-kritischem Code — es ist ein Werkzeug für probabilistische Modellierung im Energy-Aware-Programmiermodell.
→ Ausführlich: [[lyx_-_programmiersprache:das-energy-aware-programmiermodell|Energy-Aware-Programmiermodell]]
----
===== 5. Pattern Matching (match) =====
Für Enum-Fallunterscheidungen und strukturierte Typen bietet Lyx ''match'' als typsichere Alternative zu langen ''if/else if''-Ketten.
match (flight_state) {
case State.Idle => { PowerOn(); }
case State.Taxiing => { SetFlaps(10); }
case State.InAir => { RetractGear(); }
default => { LogError(); }
}
* **Exhaustiveness**: Der Compiler prüft (v0.9.0+), ob alle Enum-Werte abgedeckt sind. Fehlt ein Wert, ist es ein Compile-Fehler.
* **Kein Fallthrough**: Im Unterschied zu C/Java gibt es kein implizites Durchfallen zwischen Fällen.
* ''_'' ist der Wildcard-Fall (entspricht ''default'').
→ Vollständige Dokumentation: [[lyx_-_programmiersprache:pattern-matching|Pattern Matching]]
----
===== 6. MC/DC und DO-178C Relevanz =====
Für Luftfahrt-Zertifizierung (**DAL A/B**) reicht Branch-Coverage nicht aus — gefordert ist **Modified Condition/Decision Coverage (MC/DC)**.
// Drei Bedingungen — für MC/DC braucht man 4 Testfälle (nicht 8)
fn IsLandingAllowed(gear_down: bool, speed_ok: bool, runway_clear: bool): bool {
return gear_down & speed_ok & runway_clear;
}
Der Compiler instrumentiert alle Bedingungen für MC/DC-Analyse:
// Build mit MC/DC-Instrumentierung:
// lyxc --mcdc-instrument --coverage-report=cov.json src/flight.lyx
//
// Nach dem Testlauf Coverage-Report erzeugen:
// lyxc --coverage-report-html=report/ cov.json
> Jede Teilbedingung in einem zusammengesetzten Ausdruck muss **unabhängig** das Gesamtergebnis beeinflussen können. Der Report zeigt welche Test-Vektoren dies nachweisen.
→ Vollständige Dokumentation: [[lyx_-_programmiersprache:do-178c|DO-178C Compliance]]
----
Letzte Aktualisierung: 2026-05-22