Feng,Klarheit mit System
Feng hilft Entwicklern und KI, klaren, zuverlässigen und wartbaren Code zu schreiben
- KI-freundlich
- Explizite Verträge
- Statische Typen
- Speicherverwaltung
- Kompiliert
- Plattformneutral
Schnellinstallation
Befehl kopieren und im Terminal ausführen
module app;
import std.io;
// main ist der einzige Einstiegspunkt eines ausführbaren Programms
func main(args: string[]) {
println("Hello, world!");
println("你好,世界!");
println("¡Hola, mundo!");
println("Olá, mundo!");
println("こんにちは、世界!");
println("Привет, мир!");
println("Hallo, Welt!");
println("Bonjour le monde !");
}
module app;
// type bündelt Daten und Verhalten in einem statischen Typ
type User {
// let-Felder sind schreibgeschützt; var-Felder können geändert werden
let name: string;
let email: string;
var active: bool;
// Methoden greifen über self auf die aktuelle Instanz zu
func greeting(): string {
return "Hallo, " + self.name;
}
}
module app;
// Ein Objektvertrag deklariert erforderliches Verhalten
spec Named {
func name(): string;
}
spec Persistable {
func save(): void;
}
// Ein Funktionsvertrag deklariert die vollständige Signatur eines aufrufbaren Werts
spec Formatter(value: string): string;
// Ein Vereinigungsvertrag akzeptiert Werte mehrerer möglicher Typen
spec Identifier: int | string;
// Ein Schnittvertrag erfordert alle enthaltenen Verträge
spec Entity: Named & Persistable;
type User {
let username: string;
}
// fit erfüllt Objektverträge, ohne die Typdeklaration zu ändern
fit User: Named, Persistable {
func name(): string {
return self.username;
}
func save(): void {
}
}
module app;
import std.io;
// T macht Logik wiederverwendbar und erhält die statische Typisierung
func identity<T>(value: T): T {
return value;
}
func main(args: string[]) {
let language = identity("Feng");
println("Hallo, {0}!", language);
}
module app;
func calculate_total(): int {
var total = 0;
// Eine dreiteilige for-Schleife eignet sich für einen festgelegten Zählbereich
for var i = 1; i <= 3; i += 1 {
total += i;
}
// for/in durchläuft Array-Elemente der Reihe nach
let values = [4, 5, 6];
for let value in values {
total += value;
}
// while prüft die Bedingung vor jeder Iteration erneut
var remaining = 2;
while remaining > 0 {
total += remaining;
remaining -= 1;
}
return total;
}
module app;
func evaluate(score: int): string {
var status = "";
// Eine if/else-Anweisung führt je nach Bedingung unterschiedliche Aktionen aus
if score >= 60 {
status = "Bestanden";
} else {
status = "Nicht bestanden";
}
// Ein if-Ausdruck erzeugt direkt einen zu bindenden Wert
let level = if score >= 90 {
"Ausgezeichnet"
} else if score >= 60 {
"Bestanden"
} else {
"Verbesserungsbedarf"
};
return status + ": " + level;
}
module app;
func describe(code: int): string {
var detail = "";
// Eine match-Anweisung führt den ersten passenden Zweig aus
match code {
200 { detail = "Anfrage erfolgreich"; }
404 { detail = "Ressource nicht gefunden"; }
else { detail = "Unbekannter Status"; }
}
// Ein match-Ausdruck gibt den Wert des passenden Zweigs zurück
let category = match code {
200...299 { "Erfolg" }
400...499 { "Clientfehler" }
else { "Sonstiges" }
};
return category + ": " + detail;
}
module app;
import std.io;
func require_port(port: int): int {
if port <= 0 {
// throw beendet den aktuellen Pfad und übergibt dem Aufrufer eine Ausnahme
throw "Der Port muss positiv sein";
}
return port;
}
func main(args: string[]) {
// Die Anweisungsform führt beim Behandeln einer Ausnahme Aktionen aus
try require_port(-1) catch error: string {
println(error);
};
// Die Ausdrucksform kann bei einer Ausnahme einen Ersatzwert liefern
let port = try require_port(-1) catch error: string {
println(error);
3000
};
println("Verwendeter Port: {0}", port);
}