言語雑談会2009

あけましておめでとうございます!今年も言語雑談会に参加してきました。
id:kmizushimaさん、ありがとうございます。

備忘録はtwitterが用を為してしまってますので、ここにはid:shinichiro_hさんのスライドに対する「それAdaでできるよ」特集でいきたいと思います。

メンバ変数があったり無かったり
http://shinh.skr.jp/dat_dir/memori/005.html

type RenderStyle (hasRareData : Boolean) is record
   width, height : Integer;
   case hasRareData is
      when True =>
         -- RareCSSDataの中身を展開
      when False =>
         null;
   end case;
end record;

Pascalのバリアントレコードは構造体のサイズは最大caseになりますが、Adaのバリアントレコードは実際に必要なサイズが確保されます。その代わりhasRareDataは初期化以降変更不可です。Pascalは後から変更できました。

可変長構造体
http://shinh.skr.jp/dat_dir/memori/008.html

type TokenSym (len : Integer) is record
   tok : Integer;
   str : String (1 .. len);
end record;

複数持てます。後続のメンバの位置はlenを使って実行時に計算されます。

ビット幅がバイト境界に収まらない整数
http://shinh.skr.jp/dat_dir/memori/010.html

type T is range 0 .. 127;
type A is array (Positive range <>) of T;
for A'Component_Size use 7;

Adaのメモリサイズの単位はビット。

できないこと
http://shinh.skr.jp/dat_dir/memori/007.html カスタムアトリビュート……ない。
http://shinh.skr.jp/dat_dir/memori/009.html サイズを後から変える……先のhasRareDataやlenは書き換え不可。
http://shinh.skr.jp/dat_dir/memori/011.html 他のメモリ空間…… pragma Shared_Passiveの裏にある実装を入れ替えたらいける?

goadaが欲しいのはまさにその通りだなあと思います。accessを^と書けるだけでもだいぶ違うはず……。

そのほか
D言語の新inoutは全言語が追従するべき。