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
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);
}