私は今、構造体であり、インターフェースでもある「フレーム」という概念を扱う、なんともヘンなパラダイム、Frame-Oriented Programmingを設計しています
FOPは
- 派生実装の不完全性
- 自己等価性
-
- 相互等価性
といった性質を持ちます
派生実装の不完全性
こちらはOOPでいうところの基底クラスの抽象メソッドが、派生クラスで実装が欠落している状態がFOPでは許容されているのです
そのため、コンパイル時検証が必要になります
自己等価性
これは、OOPでは絶対に許されていない行為になります
- 例えば、フレーム
Aが抽象関数fを持っているとしましょう。同時に具象関数fも持っています(構文上、抽象と具象は分けられているものとします) - これを、自己実装すると、抽象関数
fに対して、具象関数fが実装されたことになります - この時、抽象関数
fは具象関数fだといえます - そして、抽象関数
fは「派生実装の不完全性」により無視できますから、Aは具象関数fのみを持っているといえます
具体的なコードコード
frame A : A {
abs impl Self {
abs func f(i: i32) -> i32
}
impl A {
pub func f(i: i32) -> i32 {
i * 2
}
}
}
自身を自身で実装しているのがわかると思います
ここで大事なのが、AはA自身にキャストができるということです
FOPの制約
FOPには制約があります
FOPでは、構造体かインターフェースかが不確定です
例えば、フレームBを引数にとる関数gがあったとしましょう
この時、フレームBは構造体として扱うのか、インターフェースとして扱うのかどちらかは分かりません
フレームが構造体でもありインターフェースでもあるからです
FOPでは、構造体として扱うのかインターフェースとして扱うのか明示しないといけません
しかし、それでは基底フレームと派生フレーム両方を扱うことができません
自己等価性による解決
「インターフェースとして扱う」ということは、キャストする必要があります
派生フレームであれば、キャストができるので問題ありませんが、基底フレームはできません
ここで、自己等価性を利用すると基底フレームも基底フレームにキャストができます
これで解決できるのです
相互等価性
これは、OOPの循環継承にあたります
しかし、FOPは自己実装ができるわけですから、同じ理由で相互実装ができます
終わりに
実は、後二つの性質は副産物のようなものでした
FOPはOOP以上のことができるのです
引き続き言語の実装を頑張ってまいります