Feng,Ясность в основе

Feng помогает разработчикам и ИИ писать понятный, надёжный и удобный в сопровождении код

  • Для ИИ
  • Явные контракты
  • Статические типы
  • Контроль памяти
  • Компиляция
  • Все платформы

Быстрая установка

Скопируйте команду и выполните её в терминале

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

import std.io;

// main — единственная точка входа исполняемой программы
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 объединяет данные и поведение в статический тип
type User {
  // поля let доступны только для чтения; поля var можно изменять
  let name: string;
  let email: string;
  var active: bool;

  // Методы обращаются к текущему экземпляру через self
  func greeting(): string {
    return "Привет, " + self.name;
  }
}
module app;

// Контракт объекта объявляет требуемое поведение
spec Named {
  func name(): string;
}

spec Persistable {
  func save(): void;
}

// Контракт функции объявляет полную сигнатуру вызываемого значения
spec Formatter(value: string): string;

// Контракт объединения принимает значения нескольких возможных типов
spec Identifier: int | string;

// Контракт пересечения требует выполнения всех входящих контрактов
spec Entity: Named & Persistable;

type User {
  let username: string;
}

// fit реализует контракты объекта без изменения объявления типа
fit User: Named, Persistable {
  func name(): string {
    return self.username;
  }

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

import std.io;

// T позволяет повторно использовать логику, сохраняя статическую типизацию
func identity<T>(value: T): T {
  return value;
}

func main(args: string[]) {
  let language = identity("Feng");
  println("Привет, {0}!", language);
}
module app;

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

  // Трёхчастный цикл for подходит для заданного диапазона
  for var i = 1; i <= 3; i += 1 {
    total += i;
  }

  // for/in последовательно перебирает элементы массива
  let values = [4, 5, 6];
  for let value in values {
    total += value;
  }

  // while повторно проверяет условие перед каждой итерацией
  var remaining = 2;
  while remaining > 0 {
    total += remaining;
    remaining -= 1;
  }
  return total;
}
module app;

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

  // Оператор if/else выполняет разные действия в зависимости от условия
  if score >= 60 {
    status = "Зачёт";
  } else {
    status = "Незачёт";
  }

  // Выражение if непосредственно создаёт значение для привязки
  let level = if score >= 90 {
    "Отлично"
  } else if score >= 60 {
    "Допущен"
  } else {
    "Нужно улучшить"
  };
  return status + ": " + level;
}
module app;

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

  // Оператор match выполняет первую подходящую ветвь
  match code {
    200 { detail = "Запрос выполнен"; }
    404 { detail = "Ресурс не найден"; }
    else { detail = "Неизвестный статус"; }
  }

  // Выражение match возвращает значение подходящей ветви
  let category = match code {
    200...299 { "Успех" }
    400...499 { "Ошибка клиента" }
    else { "Другое" }
  };
  return category + ": " + detail;
}
module app;

import std.io;

func require_port(port: int): int {
  if port <= 0 {
    // throw завершает текущий путь и передаёт исключение вызывающей стороне
    throw "Порт должен быть положительным";
  }
  return port;
}

func main(args: string[]) {
  // Форма оператора выполняет действия при обработке исключения
  try require_port(-1) catch error: string {
    println(error);
  };

  // Форма выражения может вернуть резервное значение при исключении
  let port = try require_port(-1) catch error: string {
    println(error);
    3000
  };
  println("Используется порт: {0}", port);
}