锋,自有章法

Feng 语言,让开发者和 AI 都更易于写出 「清晰、可靠、可维护」 的代码

  • AI 友好
  • 显式契约
  • 静态类型
  • 自动内存管理
  • 编译型
  • 跨平台

快速安装

复制命令,在终端中运行

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

import std.io;

// main 是可执行程序的唯一入口
func main(args: string[]) {
  println("你好世界");
}
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 在不修改 type 声明的情况下满足对象契约
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("Hello, {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);
}