型修飾 (調べ物パート)
FLTVの発表資料のひとつ、luciferの設計コンセプトに触発されて、妄想を垂れ流したいと思いました。
ここでの型修飾という言葉は言語組み込みの機能を指します。Cのconstみたいなやつです。C++のauto_ptrやC#のNullableやJavaの属性みたいなユーザー定義可能なものではないです。例えばD言語のimmutableをユーザー定義可能にする労力を想像していただければ。
まずは既存のものを調べます。*1
lucifer
- inaccessible (opequa typeっぽい)
- readable
- writable
- variable (readableかつwritable)
- immutable
- anonymous (右辺値)
C
- const
- restrict
- volatile
- __attribute(())__はキリがないので省略
- const
- immutable
- 推移的
- aliased (ポインタ経由で参照される)
- constant
- not null (null代入禁止ポインタ)
- range (数値の範囲制限、あと配列にも)
- 'Storage_Pool (newしたときのメモリマネージャを指定)
- 'Storage_Size (0にするとnewを禁止できる)
- pragma Atomic (x86のlockプレフィクスのようなもの)
- pragma Finalize_Storage_Only (終了時はデストラクタをサボる、GNAT拡張)
- pragma No_Strict_Aliasing (Cのrestrictの逆、GNAT拡張)
- pragma Preelaborable_Initialization (静的に初期化可能)
- pragma Volatile (Cのvolatile)
- メモリレイアウト関係は多すぎるので省略
- 型としての振る舞いに関係ないものも省略
- あとdiscriminant*2もユーザー定義constraintとして使える
- 絶対漏れあります
- Cの__attribute(())__は省略したのにこっちにはGNAT拡張を書く辺り卑怯です
*1:http://www.kmonos.net/wlog/100.html#_1705090831の『なにか Ada や〜』への補足にもなれば幸いです。Eiffelについてはどなたかお願いします。
*2:O'Camlのtype t = T of intのintみたいなの。int部分が1限定のsubtype、2限定のsubtype……が作れます。