====== 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