Skip to content

Guide Type Inference

GitHub Actions edited this page Jan 25, 2026 · 2 revisions

Type-Inference und Code-Ordering Tutorial

Version: 3.1.0
FΓΌr: Entwickler, die die neuen Type-Inference und Code-Ordering Features nutzen mΓΆchten


Übersicht

Dieses Tutorial fΓΌhrt dich durch die neuen Type-Inference und Code-Ordering Features in VelinScript 3.1.0:

  1. Type::Any Member-Access - Automatische Type-Inference basierend auf Member-Namen
  2. Result-Type Inference - Verbesserte Inference fΓΌr Result-Types
  3. Desugared Code Type Inference - Automatische Type-Verfeinerung fΓΌr transformierten Code
  4. Automatic Code Ordering - Automatische Sortierung von Code basierend auf AbhΓ€ngigkeiten

1. Type::Any Member-Access

Was ist das?

Das System unterstΓΌtzt automatische Type-Inference fΓΌr any Typen basierend auf Member-Namen. Du kannst auf any Objekte zugreifen, und das System erkennt automatisch den Typ basierend auf dem Member-Namen.

Beispiel

fn processData(data: any) {
    // Automatische Type-Inference
    if (data.startsWith("http://")) {
        // data.startsWith() β†’ Boolean (automatisch inferiert)
        return data.toUpperCase(); // β†’ String
    }
    
    if (data.length > 0) {
        // data.length β†’ Number
        return data.trim(); // β†’ String
    }
    
    // Unbekannte Member geben Any zurΓΌck (kein Fehler)
    return data.unknownMethod(); // β†’ Any
}

UnterstΓΌtzte Member-Patterns

String-Methoden:

  • length β†’ Number
  • toUpperCase(), toLowerCase(), trim() β†’ String
  • startsWith(), endsWith(), contains() β†’ Boolean

List-Methoden:

  • length, size, len β†’ Number
  • push(), pop(), clear() β†’ Void
  • map(), filter() β†’ List<Any>
  • find(), get() β†’ Optional<Any>

Map-Methoden:

  • get() β†’ Optional<Any>
  • set(), insert(), put() β†’ Void
  • has(), containsKey() β†’ Boolean
  • keys(), values() β†’ List<Any>

Best Practices

  • Nutze bekannte Member-Namen: Das System erkennt gΓ€ngige Patterns automatisch
  • Fallback zu expliziten Typen: Wenn mΓΆglich, verwende explizite Typen fΓΌr bessere Type-Safety

2. Result-Type Inference

Was ist das?

Das System verbessert die Type-Inference fΓΌr Result-Types durch automatische AuflΓΆsung verschachtelter Result-Types und korrekte Type-Propagation.

Beispiel

fn fetchUser(): Result<Result<User, string>, string> {
    // Verschachtelte Result-Types werden automatisch aufgelΓΆst
    return Result.ok(Result.ok(User { name: "John" }));
}

fn main() {
    let result = fetchUser(); 
    // Type wird automatisch zu Result<User, string> aufgelΓΆst
    // (nicht Result<Result<User, string>, string>)
    
    if (result.isOk()) {
        let user = result.unwrap(); // β†’ User (korrekt inferiert)
    }
}

Features

  • Verschachtelte Result-Types: Automatische AuflΓΆsung von Result<Result<T, E>, E> β†’ Result<T, E>
  • Type-Propagation: Korrekte Propagation in Variablenzuweisungen
  • Call-Expression Support: Verbesserte Inference in Funktionsaufrufen

Best Practices

  • Vermeide unnΓΆtige Verschachtelung: Explizite Typen sind klarer
  • Nutze Type-Propagation: Das System propagiert Result-Types automatisch

3. Desugared Code Type Inference

Was ist das?

Das System verfeinert automatisch die Typen von desugared Variablen (z.B. __try_result, __await_result_*) nach dem initialen Type-Check-Pass.

Beispiel

fn fetchData(): Result<string, string> {
    try {
        return "success";
    } catch (e: string) {
        return Result.err("error");
    }
}

fn main() {
    // __try_result wird initial als Any registriert
    // Nach refine_desugared_types wird es zu Result<string, string> verfeinert
    let result = __try_result; // β†’ Result<string, string> (verfeinert)
    
    if (result.isOk()) {
        let data = result.unwrap(); // β†’ string (korrekt inferiert)
    }
}

UnterstΓΌtzte Desugared Variablen

  • __try_result: Typ wird aus dem try-Block's Return-Type abgeleitet
  • __await_result_*: Typ wird aus dem await-Ausdruck abgeleitet
  • Andere __* Variablen: Typ wird aus dem Wert-Ausdruck abgeleitet

Best Practices

  • Vertraue auf automatische Verfeinerung: Das System verfeinert Typen automatisch
  • Verwende try-catch fΓΌr bessere Inference: try-catch BlΓΆcke werden automatisch zu Result-Types transformiert

4. Automatic Code Ordering

Was ist das?

Das System sortiert automatisch Funktionen, Typen und BlΓΆcke basierend auf ihren AbhΓ€ngigkeiten, sodass sie korrekt aufeinander aufbauen.

Beispiel

Vorher (manuelle Reihenfolge):

fn processUser(user: User) {
    return user.name.toUpperCase();
}

struct User {
    name: string;
    email: string;
}

Nachher (automatisch sortiert):

struct User {
    name: string;
    email: string;
}

fn processUser(user: User) {
    return user.name.toUpperCase();
}

Die User Struct wird automatisch vor processUser platziert, da die Funktion von User abhΓ€ngt.

Sortierreihenfolge

  1. Use Statements (immer zuerst)
  2. TypeAliases (Typ-Definitionen)
  3. Enums (Enum-Definitionen)
  4. Structs (Struct-Definitionen)
  5. Traits (Trait-Definitionen)
  6. Impls (Trait-Implementierungen)
  7. Functions (Funktions-Definitionen)
  8. TopLevelCode (Top-Level AusdrΓΌcke, immer zuletzt)

Innerhalb jeder Kategorie: AbhΓ€ngigkeitsbasierte Sortierung

Komplexes Beispiel

// Input (unsortiert)
fn createUser(name: string): User {
    return User { name, email: generateEmail(name) };
}

fn generateEmail(name: string): string {
    return format("{}@example.com", name);
}

struct User {
    name: string;
    email: string;
}

// Output (automatisch sortiert)
struct User {
    name: string;
    email: string;
}

fn generateEmail(name: string): string {
    return format("{}@example.com", name);
}

fn createUser(name: string): User {
    return User { name, email: generateEmail(name) };
}

ZirkulΓ€re AbhΓ€ngigkeiten

Das System erkennt zirkulΓ€re AbhΓ€ngigkeiten und meldet sie als Fehler:

Error: Circular dependency detected involving: User, UserService

Best Practices

  • Schreibe Code in natΓΌrlicher Reihenfolge: Das System sortiert automatisch
  • Nutze explizite Typen: Explizite Typen helfen dem System, AbhΓ€ngigkeiten besser zu erkennen
  • Vermeide zirkulΓ€re AbhΓ€ngigkeiten: ZirkulΓ€re AbhΓ€ngigkeiten werden erkannt, aber sollten vermieden werden

5. Build Orchestration (Multi-File)

Was ist das?

Der BuildOrchestrator orchestriert den gesamten Build-Ablauf automatisch basierend auf AbhΓ€ngigkeiten zwischen Dateien.

Beispiel

Projekt-Struktur:

project/
  β”œβ”€β”€ main.velin
  β”œβ”€β”€ models.velin
  └── services.velin

Dependencies:

  • main.velin β†’ models.velin, services.velin
  • services.velin β†’ models.velin

Kompilierungsreihenfolge (automatisch):

  1. models.velin
  2. services.velin
  3. main.velin

Use-Statement Analyse

Das System analysiert use Statements, um Datei-AbhΓ€ngigkeiten zu bestimmen:

// main.velin
use models;
use services;

// models.velin wird vor main.velin kompiliert
// services.velin wird vor main.velin kompiliert

Best Practices

  • Nutze use Statements: Das System verwendet use Statements, um Datei-AbhΓ€ngigkeiten zu bestimmen
  • Organisiere Module logisch: Auch wenn die Sortierung automatisch ist, hilft logische Organisation

Zusammenfassung

Type-Inference Features

βœ… Type::Any Member-Access - Automatische Inference basierend auf Member-Namen
βœ… Result-Type Inference - Verbesserte Inference fΓΌr Result-Types
βœ… Desugared Code Type Inference - Automatische Type-Verfeinerung

Code-Ordering Features

βœ… Automatic Code Ordering - Automatische Sortierung basierend auf AbhΓ€ngigkeiten
βœ… Build Orchestration - Multi-File Dependency-Management

Vorteile

  • Weniger manuelle Arbeit: Keine manuelle Code-Sortierung nΓΆtig
  • Bessere Type-Safety: Automatische Type-Inference fΓΌr any Typen
  • Klarerer Code: Automatische Sortierung macht AbhΓ€ngigkeiten sichtbar
  • Multi-File Support: Automatische Kompilierungsreihenfolge fΓΌr große Projekte

NΓ€chste Schritte


Letzte Aktualisierung: 2026-01-30
Version: 3.1.0


← ZurΓΌck zur Übersicht

Clone this wiki locally