====== Lyx – Arrays & Maps ====== Lyx bietet effiziente Wege, um Datenmengen zu verwalten. Arrays sind auf maximale Performance und Vorhersehbarkeit ausgelegt, während Maps flexible Schlüssel-Wert-Paare ermöglichen. ===== 1) Arrays (Indizierte Listen) ===== In Lyx sind Arrays dynamisch und werden auf dem Heap verwaltet. Sie speichern ihre Länge und Kapazität direkt mit dem Pointer ("Fat Pointer"), was sie sicherer als reine C-Arrays macht. ==== Deklaration und Initialisierung ==== // Ein leeres Array für Ganzzahlen var numbers: array; // Initialisierung mit Werten (Literal) var primes: array := [2, 3, 5, 7, 11]; ==== Operationen (Builtins) ==== Lyx bietet hocheffiziente Builtins für die Arbeit mit Arrays: .len(): Gibt die Anzahl der Elemente zurück. .push(val): Fügt ein Element am Ende hinzu (vergrößert das Array bei Bedarf). .pop(): Entfernt und liefert das letzte Element. .clear(): Leert das Array, behält aber den reservierten Speicher. primes.push(13); let size := primes.len(); // 6 ===== 2) Mehrdimensionale Arrays & Matrizen ===== Lyx unterstützt geschachtelte Arrays. Da diese jedoch "Arrays von Arrays" sind, liegen die Zeilen nicht zwingend hintereinander im Speicher. var matrix: array>; // Zugriff: matrix[y][x] ===== 3) Maps (Assoziative Speicher) ===== Maps (auch Hash-Tabellen oder Wörterbücher genannt) sind in der Unit std.List (oder spezifisch std.Map) definiert. Sie erlauben den Zugriff über einen Schlüssel (z. B. einen String). Import: import std.List; var scores: Map := Map.Create(); scores.Set("Player1", 1500); scores.Set("Player2", 1250); let s := scores.Get("Player1"); // 1500 ==== Performance-Hinweis ==== Arrays: O(1) Zugriff über den Index. Ideal für CPU-Caches. Maps: O(1) im Durchschnitt, aber langsamer als Arrays wegen der Hash-Berechnung. ===== 4) Parallel Arrays (SIMD-Optimierung) ===== Ein besonderes Feature von Lyx (v0.2.2+) sind ParallelArrays. Diese nutzen die SIMD-Einheiten der CPU (SSE, AVX, NEON), um Operationen auf allen Elementen gleichzeitig auszuführen. var data := parallel Array(1024); // Operationen wie data := data * 2.0 werden vom Compiler // in hocheffiziente Vektor-Instruktionen übersetzt. ===== 5) Speicherverwaltung ===== Da Arrays und Maps auf dem Heap liegen, müssen sie manuell freigegeben werden, um Memory Leaks zu vermeiden: var buffer: array := [0, 0, 0]; // ... Nutzung ... dispose buffer; // Gibt den Heap-Speicher frei