Feng,Clareza por design

Feng ajuda desenvolvedores e IA a escrever código claro, confiável e fácil de manter

  • Amigável à IA
  • Contratos explícitos
  • Tipagem estática
  • Memória gerenciada
  • Compilada
  • Multiplataforma

Instalação rápida

Copie o comando e execute-o no terminal

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

import std.io;

// main é o único ponto de entrada de um programa executável
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 dados e comportamento em um tipo estático
type User {
  // campos let são somente leitura; campos var podem ser alterados
  let name: string;
  let email: string;
  var active: bool;

  // Métodos acessam a instância atual por meio de self
  func greeting(): string {
    return "Olá, " + self.name;
  }
}
module app;

// Um contrato de objeto declara o comportamento exigido
spec Named {
  func name(): string;
}

spec Persistable {
  func save(): void;
}

// Um contrato de função declara a assinatura completa de um valor chamável
spec Formatter(value: string): string;

// Um contrato de união aceita valores de vários tipos candidatos
spec Identifier: int | string;

// Um contrato de interseção exige todos os contratos membros
spec Entity: Named & Persistable;

type User {
  let username: string;
}

// fit satisfaz contratos de objeto sem alterar a declaração do tipo
fit User: Named, Persistable {
  func name(): string {
    return self.username;
  }

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

import std.io;

// T torna a lógica reutilizável sem perder a tipagem estática
func identity<T>(value: T): T {
  return value;
}

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

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

  // Um laço for de três partes serve para um intervalo de contagem definido
  for var i = 1; i <= 3; i += 1 {
    total += i;
  }

  // for/in percorre os elementos do array em ordem
  let values = [4, 5, 6];
  for let value in values {
    total += value;
  }

  // while verifica novamente a condição antes de cada iteração
  var remaining = 2;
  while remaining > 0 {
    total += remaining;
    remaining -= 1;
  }
  return total;
}
module app;

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

  // Uma instrução if/else executa ações diferentes conforme a condição
  if score >= 60 {
    status = "Aprovado";
  } else {
    status = "Reprovado";
  }

  // Uma expressão if produz diretamente um valor para vincular
  let level = if score >= 90 {
    "Excelente"
  } else if score >= 60 {
    "Aprovado"
  } else {
    "Precisa melhorar"
  };
  return status + ": " + level;
}
module app;

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

  // Uma instrução match executa o primeiro ramo correspondente
  match code {
    200 { detail = "Solicitação concluída"; }
    404 { detail = "Recurso não encontrado"; }
    else { detail = "Status desconhecido"; }
  }

  // Uma expressão match retorna o valor do ramo correspondente
  let category = match code {
    200...299 { "Sucesso" }
    400...499 { "Erro do cliente" }
    else { "Outro" }
  };
  return category + ": " + detail;
}
module app;

import std.io;

func require_port(port: int): int {
  if port <= 0 {
    // throw encerra o caminho atual e passa uma exceção ao chamador
    throw "A porta deve ser positiva";
  }
  return port;
}

func main(args: string[]) {
  // A forma de instrução executa ações ao tratar uma exceção
  try require_port(-1) catch error: string {
    println(error);
  };

  // A forma de expressão pode fornecer um valor alternativo em caso de exceção
  let port = try require_port(-1) catch error: string {
    println(error);
    3000
  };
  println("Usando a porta: {0}", port);
}