🍅

静的型付けスクリプト言語「Metro」

2023/03/30に公開約1,400字

2 月より私が開発している静的型付けスクリプト言語 Metro を紹介します。

About

Rust のような構文で、Rust よりシンプル、そしてスクリプトなので手軽に実行できることが特徴です。また、1 から全て C++ で書かれており、Lex や Yacc などというライブラリは一切使用しておりません。

リポジトリ
ドキュメント

ビルド & HelloWorld

git clone https://github.com/bomkei/metro.git
cd metro
make release -j
./metro -c "println(\"Hello, World!\");"

サンプルコード

言語仕様については metro-docs/language.md を参照

ハローワールド

main 関数はいらないので 1 行で書けます。

println("Hello, World!");

変数を定義する

let 文を用いて変数を定義することができます。シャドウイングも可能。

let num = 123;
let num = "num is " + to_string(num);

println(num); // => num is 123

関数を定義する

フィボナッチ数を計算する関数の例。

fn fibo(n: int) -> int {
  if n < 2 {
    return 1;
  }

  fibo(n - 2) + fibo(n - 1)
}

println(fibo(10)); // => 89

構造体、列挙型

new キーワードで構造体 Person のオブジェクトを初期化子付きで作成し、表示する例です。
列挙型の要素は任意の型の値を一つもたせることができます。

enum Gender {
  Red,
  Blue,
  Other(string)
}

struct Person {
  name: string,
  gender: Gender,
  age: float
}

let person = new Person(name: "letz",
                        gender: Gender.Blue,
                        age: 17.5);

println(person);
  // => Person{ name: "letz", gender: Gender.Blue, age: 17.5 }

拡張関数

impl 構文を使って、任意の型に拡張関数を追加することができます。
拡張関数は、メンバ関数と同じ構文で呼び出すことができます。

以下、int の拡張関数 twice を定義して呼び出す例

impl int {
  fn twice(self) -> int {
    self * 2
  }
}

pritnln(10.twice()); // => 20

Discussion

ログインするとコメントできます