null=Hoge'Access
でGNATが落ちる…
続きを読むhttp://www.adacore.com/2007/05/21/gem-2/
#1の例で相変わらずZはエラーですが、Bの初期値として<>を与えることで、
X:T; -- 正しい。X.A=42, X.B='@' Y:T := (A=>99, B=>'0'); -- 正しい。 X.A=99, X.B='0' Z:T := (A=>64, B=> <>); -- 正しい。 X.A=64, X.B='@'
T宣言時の初期値を使うことができます。
元記事の最後に触れられている注意は、型宣言で既定値が設定されていないスカラ値は(当然)不定ということです。*1
以下のような場合Wの要素は不定です
type U is array(1..5) of Character; type V is array(1..5) of S; W:V:=(others=> (others=> <>));
が、表記上初期化されているので単に初期化されていない場合に通常出る警告が出ません。(少なくともウチのGNAT 4.4.1では)
*1:2012でスカラも既定値の設定できるようになるらしい
http://www.adacore.com/2007/05/14/gem-1/
例えば、以下のTとX,Y,Zを考えたとき、
type T is limited record A:Integer:=42; B:Character:='@'; end record; X:T; Y:T:=(A=>99,B=>'0'); Z:T:=(A=>64);
Ada95では、
X:T; -- 正しい。 X.A=42, X.B='@' Y:T:=(A=>99,B=>'0'); -- コンパイルエラー Z:T:=(A=>64); -- コンパイルエラー
となるわけです。
しかし、Ada05ではlimited型でもaggregateで初期化できるため、
X:T; -- 正しい。 X.A=42, X.B='@' Y:T:=(A=>99,B=>'0'); -- 正しい。 X.A=99, X.B='0' Z:T:=(A=>64); -- コンパイルエラー
Yもコンパイルが通ります。
aggregateなので型が合えばothersでまとめて初期化ができます。
type U is limited record A,B:Integer; end record; V:U:=(others=>42);
なんかネタで縛りかければ持続するかな、とか(以前の記憶から目を逸らしつつ)
というわけで1日1gem斜め読み開始。
横に読もうが縦に読もうが得られる情報に大差がないお察しな英語レベルですけど。
MacBook Air 11インチ欲しい!
そういえばいつぞやHPがTwitterで同じようなことやった時に、HPのアカウントをフォローしてそのままだ…