Feng、明快さを設計する

Fengは、開発者とAIが明快で信頼性が高く、保守しやすいコードを書くことを支援します

  • AIフレンドリー
  • 明示的契約
  • 静的型付け
  • 自動メモリ管理
  • コンパイル方式
  • マルチOS対応

クイックインストール

コマンドをコピーしてターミナルで実行してください

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;

  // 3部構成の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);
}