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

curl -fsSL https://feng-lang.com/install.sh | bash
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);
}