読者です 読者をやめる 読者になる 読者になる

柔軟なメソッド定義が可能なプログラミング言語Suzu

Suzu

自作のプログラミング言語SuzuをGitHubにて公開しています.

Suzuは以下のような機能を持ちます.

  • 柔軟なメソッド定義
    • ローカル変数ならぬローカルメソッドの定義
    • シャドーイング
    • モジュールからのインポート・エクスポート
    • 関数の仮引数としての指定
  • モジュールを返す関数としてのトレイト
  • ユーザー定義演算子
  • 限定継続
  • 複数の関数リテラルラベル付き引数として渡せる
  • バリアント,レコード,パターンマッチング

最大の特徴は,柔軟なメソッド定義が可能であることです.

RubyにはRefinementsという機能があり, スコープを限定してメソッドを再定義することができます. クラスにメソッドを格納するRubyのような言語ではこのような仕組みを用意することは妥当でしょう.

これに対しSuzuは,環境にメソッドを直接格納することで,複雑な仕組みを用意することなく メソッドの局所的な再定義を可能にします.

assert(3 / 2 == 1)
begin:
  def Int::C#(/)(self, other):
    Float::from_int(self) / Float::from_int(other)
  end
  assert(3 / 2 == 1.5)
end
assert(3 / 2 == 1)

メソッドクラス名とメソッド名の組をキーとして環境に直接格納されます. 上の例ではクラス名Int::Cメソッド(/)の組Int::C#(/)に対しメソッドを定義しています. これによりbeginからendまでのスコープでのみ除算演算子が再定義されます.

定義したいメソッド群をモジュールとして提供することもできます.

module DivToFloat:
  def Int::C#(/)(self, other):
    Float::from_int(self) / Float::from_int(other)
  end
  export Int::C#(/)
end
assert(3 / 2 == 1)
begin:
  open DivToFloat
  assert(3 / 2 == 1.5)
end
assert(3 / 2 == 1)

モジュールをopenすることで,モジュールからエクスポートされている定義を 任意のスコープにインポートすることが可能です.

その他の特徴についてはサンプルプログラムを 読んでいただくとなんとなくわかると思います. そのうちより詳しい解説を載せる予定です.

また1月に開催されるプログラミング・シンポジウムでは, 「環境にメソッドを直接格納する新しいオブジェクトシステムの提案」というタイトルで Suzuのオブジェクトシステムについて発表します.