Type-Inference System
Das VelinScript Type-Inference System bietet intelligente Typ-Inferenz für verschiedene Code-Konstrukte, einschließlich automatischer String-Konvertierung, Result-Type-Inference und verbesserter Type-Inference für desugared Code.
Übersicht
Das Type-Inference System ist ein Kernbestandteil des Compilers, der sicherstellt, dass Typen korrekt abgeleitet und validiert werden, ohne dass der Entwickler jeden Typ explizit angeben muss.
Features
1. Type::Any Member-Access mit automatischer Type-Inference
Das System unterstützt automatische Type-Inference basierend auf Member-Namen für Type::Any Objekte. Dies ermöglicht flexible Member-Zugriffe mit intelligenter Typ-Erkennung.
String-Methoden
- length → Number
- toUpperCase, toLowerCase → String
- startsWith, contains → Boolean
List-Methoden
- size, len → Number
- push, pop, clear → Void
- map, filter → List<Any>
Map-Methoden
- set, delete → Void
- has, containsKey → Boolean
- keys, values → List<Any>
Beispiel
fn processData(data: any) {
// Automatische Type-Inference basierend auf Member-Namen
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
}Implementierung (Rust)
Type::Any => {
// Type::Any member access with type inference based on member name
match member.as_str() {
"length" => Ok(Type::Number),
"toUpperCase" | "toLowerCase" | "trim" => Ok(Type::String),
"startsWith" | "endsWith" | "contains" => Ok(Type::Boolean),
// ... weitere Patterns
_ => Ok(Type::Any), // Fallback
}
}2. Result-Type Inference Verbesserung
Das System verbessert die Type-Inference für Result-Types durch automatische Auflösung verschachtelter Result-Types und korrekte Type-Propagation.
- VerschachtelungAutomatische Auflösung von Result<Result<T, E>, E> → Result<T, E>
- PropagationKorrekte Propagation von Result-Types in Variablenzuweisungen und Calls.
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
if (result.isOk()) {
let user = result.unwrap(); // → User (korrekt inferiert)
}
}3. Desugared Code Type Inference
Das System verfeinert die Typen von desugared Variablen nach dem initialen Type-Check-Pass, um bessere Type-Inference für transformierten Code zu ermöglichen.
__try_result
Typ aus try-Block's Return-Type.
__await_result_*
Typ aus await-Ausdruck.
__* Variablen
Verfeinert aus Wert-Ausdruck.
Integration in den Compiler
Type-Check-Flow
Expression/Statement → check_expression / check_statement
↓ Type::Any Member-Access? → Member-Name-basierte Inference
↓ Result-Type? → resolve_result_type (verschachtelte Auflösung)
↓ Return Type
Best Practices
Any Member-Access
Nutze bekannte Patterns wie length oder toUpperCase für optimale Inferenz.
Result-Types
Das System löst Verschachtelungen auf, aber klare Typ-Annotationen erhöhen die Lesbarkeit.