柔軟なメソッド定義が可能なプログラミング言語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のオブジェクトシステムについて発表します.