Feng,Ясность в основе
Feng помогает разработчикам и ИИ писать понятный, надёжный и удобный в сопровождении код
- Для ИИ
- Явные контракты
- Статические типы
- Контроль памяти
- Компиляция
- Все платформы
Быстрая установка
Скопируйте команду и выполните её в терминале
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);
}