Feng,Claridad por diseño

Feng ayuda a desarrolladores e IA a escribir código claro, fiable y fácil de mantener

  • Compatible con IA
  • Contratos explícitos
  • Tipado estático
  • Memoria gestionada
  • Compilado
  • Multiplataforma

Instalación rápida

Copia el comando y ejecútalo en tu terminal

curl -fsSL https://feng-lang.com/install.sh | bash
module app;

import std.io;

// main es el único punto de entrada de un programa ejecutable
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 organiza datos y comportamiento en un tipo estático
type User {
  // los campos let son de solo lectura; los campos var se pueden actualizar
  let name: string;
  let email: string;
  var active: bool;

  // Los métodos acceden a la instancia actual mediante self
  func greeting(): string {
    return "Hola, " + self.name;
  }
}
module app;

// Un contrato de objeto declara el comportamiento requerido
spec Named {
  func name(): string;
}

spec Persistable {
  func save(): void;
}

// Un contrato de función declara la firma completa de un valor invocable
spec Formatter(value: string): string;

// Un contrato de unión acepta valores de varios tipos candidatos
spec Identifier: int | string;

// Un contrato de intersección requiere todos sus contratos miembros
spec Entity: Named & Persistable;

type User {
  let username: string;
}

// fit satisface contratos de objeto sin cambiar la declaración del tipo
fit User: Named, Persistable {
  func name(): string {
    return self.username;
  }

  func save(): void {
  }
}
module app;

import std.io;

// T permite reutilizar la lógica conservando los tipos estáticos
func identity<T>(value: T): T {
  return value;
}

func main(args: string[]) {
  let language = identity("Feng");
  println("¡Hola, {0}!", language);
}
module app;

func calculate_total(): int {
  var total = 0;

  // Un bucle for de tres partes sirve para un intervalo de conteo definido
  for var i = 1; i <= 3; i += 1 {
    total += i;
  }

  // for/in recorre los elementos del array en orden
  let values = [4, 5, 6];
  for let value in values {
    total += value;
  }

  // while vuelve a comprobar la condición antes de cada iteración
  var remaining = 2;
  while remaining > 0 {
    total += remaining;
    remaining -= 1;
  }
  return total;
}
module app;

func evaluate(score: int): string {
  var status = "";

  // Una sentencia if/else realiza acciones distintas según la condición
  if score >= 60 {
    status = "Aprobado";
  } else {
    status = "Suspenso";
  }

  // Una expresión if produce directamente un valor para vincular
  let level = if score >= 90 {
    "Excelente"
  } else if score >= 60 {
    "Apto"
  } else {
    "Necesita mejorar"
  };
  return status + ": " + level;
}
module app;

func describe(code: int): string {
  var detail = "";

  // Una sentencia match ejecuta la primera rama coincidente
  match code {
    200 { detail = "Solicitud completada"; }
    404 { detail = "Recurso no encontrado"; }
    else { detail = "Estado desconocido"; }
  }

  // Una expresión match devuelve el valor de la rama coincidente
  let category = match code {
    200...299 { "Éxito" }
    400...499 { "Error del cliente" }
    else { "Otro" }
  };
  return category + ": " + detail;
}
module app;

import std.io;

func require_port(port: int): int {
  if port <= 0 {
    // throw termina la ruta actual y pasa una excepción al llamador
    throw "El puerto debe ser positivo";
  }
  return port;
}

func main(args: string[]) {
  // La forma de sentencia realiza acciones mientras gestiona una excepción
  try require_port(-1) catch error: string {
    println(error);
  };

  // La forma de expresión puede proporcionar un valor alternativo ante una excepción
  let port = try require_port(-1) catch error: string {
    println(error);
    3000
  };
  println("Puerto en uso: {0}", port);
}