-
Notifications
You must be signed in to change notification settings - Fork 0
Guide Type Inference
Version: 3.1.0
Für: Entwickler, die die neuen Type-Inference und Code-Ordering Features nutzen möchten
Dieses Tutorial führt dich durch die neuen Type-Inference und Code-Ordering Features in VelinScript 3.1.0:
- Type::Any Member-Access - Automatische Type-Inference basierend auf Member-Namen
- Result-Type Inference - Verbesserte Inference für Result-Types
- Desugared Code Type Inference - Automatische Type-Verfeinerung für transformierten Code
- Automatic Code Ordering - Automatische Sortierung von Code basierend auf Abhängigkeiten
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.
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
}
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>
- 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
Das System verbessert die Type-Inference für Result-Types durch automatische Auflösung verschachtelter Result-Types und korrekte Type-Propagation.
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)
}
}
-
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
- Vermeide unnötige Verschachtelung: Explizite Typen sind klarer
- Nutze Type-Propagation: Das System propagiert Result-Types automatisch
Das System verfeinert automatisch die Typen von desugared Variablen (z.B. __try_result, __await_result_*) nach dem initialen Type-Check-Pass.
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)
}
}
-
__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
- 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
Das System sortiert automatisch Funktionen, Typen und Blöcke basierend auf ihren Abhängigkeiten, sodass sie korrekt aufeinander aufbauen.
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.
- Use Statements (immer zuerst)
- TypeAliases (Typ-Definitionen)
- Enums (Enum-Definitionen)
- Structs (Struct-Definitionen)
- Traits (Trait-Definitionen)
- Impls (Trait-Implementierungen)
- Functions (Funktions-Definitionen)
- TopLevelCode (Top-Level Ausdrücke, immer zuletzt)
Innerhalb jeder Kategorie: Abhängigkeitsbasierte Sortierung
// 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) };
}
Das System erkennt zirkuläre Abhängigkeiten und meldet sie als Fehler:
Error: Circular dependency detected involving: User, UserService
- 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
Der BuildOrchestrator orchestriert den gesamten Build-Ablauf automatisch basierend auf Abhängigkeiten zwischen Dateien.
Projekt-Struktur:
project/
├── main.velin
├── models.velin
└── services.velin
Dependencies:
-
main.velin→models.velin,services.velin -
services.velin→models.velin
Kompilierungsreihenfolge (automatisch):
models.velinservices.velinmain.velin
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
-
Nutze
useStatements: Das System verwendetuseStatements, um Datei-Abhängigkeiten zu bestimmen - Organisiere Module logisch: Auch wenn die Sortierung automatisch ist, hilft logische Organisation
✅ 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
✅ Automatic Code Ordering - Automatische Sortierung basierend auf Abhängigkeiten
✅ Build Orchestration - Multi-File Dependency-Management
- Weniger manuelle Arbeit: Keine manuelle Code-Sortierung nötig
-
Bessere Type-Safety: Automatische Type-Inference für
anyTypen - Klarerer Code: Automatische Sortierung macht Abhängigkeiten sichtbar
- Multi-File Support: Automatische Kompilierungsreihenfolge für große Projekte
- Type Inference Dokumentation - Detaillierte technische Dokumentation
- Code Ordering Dokumentation - Detaillierte technische Dokumentation
- Compiler Architecture - Compiler-Pass-System
Letzte Aktualisierung: 2026-01-30
Version: 3.1.0
- Compiler Architecture
- Pass-Verlauf
- Type Inference
- Code Ordering
- IR Representation
- Borrow Checker
- Code Generation
- Multi-Target Compilation
- Module Resolution
- Framework Integration
- Parallelization
- AI Compiler Passes
- Prompt Optimizer
- System Generation
- Basics
- APIs
- Security
- Database
- Validation
- Authentication
- ML/LLM
- Intelligence Features
- Type Inference
- ML Training
- Pattern Matching
- Closures
- Collections
- HTTP Client
- String Interpolation
- Debugger
- Vektor-Datenbanken
- CLI Reference
- API Keys Setup
- Advanced
- Backend
- Security Best Practices
- AI/ML
- Auto Imports
- Plugin Development