型修飾 (調べ物パート)

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(())__はキリがないので省略

D

  • const
  • immutable
  • 推移的

Ada

  • 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……が作れます。