Ada 202x (48日目) - 3月11日の電子会議の結果¶
3月11日に行われた電子会議の議事録が公開されました。 次の会議は6月ではありませんでしたっけ?あれ? それに私どんな風にこれ書いてましたでしょうか、すっかり忘れてますね。
Globalアスペクトの変更¶
Globalアスペクトに変更が加えられています。
private ofの削除¶
パッケージの隠されたグローバル変数にアクセスしていることを表す private of
記法が削除されます。
パッケージ名だけを書いてパッケージにある全てのグローバル変数を意味するのは有効です。
隠されたグローバル変数にアクセスしていてかつ公開部にあるグローバル変数には一部しかアクセスしていない状況で細かい指定ができなくなりますが、 private of
という文法もどうかと思うのも確かですので、まあいいのではないでしょうか。
必要なら将来別の記法が追加されるでしょう。
19日目を修正しました。
synchronizedが集合扱いに¶
同期を行っていることを表す synchronized
に個別の変数名を指定できなくなります。
all
同様に synchronized
だけで集合扱いになります。
19日目を修正しました。
Unspecified¶
Global => Unspecified
で未指定を明記できるようになります。
そもそも Global
アスペクトを書かないのと同じです。
SPARKとの互換性のためだそうです。
多態¶
多態していることを表す記法が追加されます。
do Primitive (Object)
でtagged型のオブジェクト Object
のプリミティブである Primitive
を多態呼び出ししていることを表せます。
type T is abstract tagged null record;
procedure Primitive (Object : in out T) is abstract;
procedure Proc1 (Object : in out T'Class)
with Global => do Primitive (Object);
procedure Proc1 (Object : in out T'Class) is
begin
Primitive (Object);
end Proc1
これ本当に必要でしょうか?
この場合 Primitive
に Global'Class
を指定すればそれが多態先も含めて守られるはずですし。
記法が変更されました。
Global
と do
の代わりに Dispatching
アスペクトになります。
genericの引数の使用¶
generic packageの引数も中の各エンティティから見ればグローバル変数のようなものです。 その使用を表す記法が追加されます。
generic
X : in out Integer;
package Generic_Pkg1 is
procedure Proc
with Global => use X;
end Generic_Pkg1;
全てを使うことを示すために all
や何も使わないことを示すために null
と書くこともできます。
記法が変更されました。
Global
と use
の代わりに Use_Formal
アスペクトになります。
pragma Restrictions (No_Unspecified_Globals)¶
pragma Restrictions
で全てのサブプログラムに Global
を明記することを強制できるようになります。
Ada.Containers.Indefinite_Holders/Bounded_Indefinite_Holders¶
Swap
が追加されます。
Move
を3回呼ぶのは Bounded_Indefinite_Holders
の場合に非効率だからだそうです。
確かにBounded版コンテナは必要なメモリを固定で抱えてますので常に全体をコピーする必要があります。
ということは将来他の全てのBounded版コンテナにも Swap
が追加されるかもしれませんね。
35日目に追記しました。
Ada.Streams.Storage¶
'Put_Image
属性の出力先は Ada.Strings.Text_Buffers
になり Ada.Streams.Storage
は使われなくなりましたが、あると便利なので残されることになりました。
System.Atomic_Operations.Integer_Arithmetic/Modular_Arithmetic¶
mod型用の System.Atomic_Operations.Modular_Arithmetic
が追加されます。
それに伴い System.Atomic_Operations.Arithmetic
は Integer_Arithmetic
となります。
列挙型とfreezing¶
列挙型の要素を自分自身の Default_Value
アスペクトの指定に使った場合はfreezingされないようになります。
type E is (A, B, C) with Default_Value => A;
static式¶
固定小数点型の 'Small
属性がstaticになります。
declare式がstaticになります。
えっこれまでの文面ではdeclare式がstaticではなかったの……?と驚いてます。 ともあれひと安心。
Simple_Barriers/Pure_Barriersの緩和¶
pragma Restrictions (Simple_Barriers);
が有効な場合でもバリアの式からrecord型の要素にアクセスできるようになります。
protected
自身のアスペクトでprivate部の変数を使いたくても可視性のためにできない場合があります。
そこでrecord型でラップできるようにするための変更だそうです。
標準ライブラリの事前条件の式¶
これまでの文面ではif式等も使われていましたが全て (... or else raise ...) and then ...
の形に直されるようです。
if式を使うのは従来if文で行っていたエラーチェックをそのまま移動してくるのに適していて、論理演算子はpragma Assert
等との統一に適している、と思います。
個人的にも論理演算子の方が好きです。
genericの仮引数にまつわる変更¶
Ada 202xでは generic
の仮引数に事前条件と事後条件を書けるようになりました。
任意の式が書けてしまうと色々まずいことも起こせてしまいますのでルールが追加されます。
仮引数リストから
generic
本体のエンティティを前方参照することはできません。
generic
with procedure P1 with Pre => Cond; -- error
package G1 is
Cond : Boolean;
end G1;
仮引数が
renames
された場合にも事前条件/事後条件は有効です。
declare
procedure Null_Proc is null;
generic
with procedure P2 with Pre => False;
package G2 is
procedure Exported renames P2;
-- with Pre => False
end G2;
package I2 is new G2 (Null_Proc);
begin
G2.Exported; -- Assertion_Error
end;
仮引数が
renames
された場合インスタンスと同じレベルで宣言されたものと見做されます。
declare
procedure Null_Proc is null;
generic
with procedure P3;
package G3 is
procedure Exported renames P3;
procedure Other_Renaming renames Null_Proc;
end G3;
X : access procedrue;
begin
declare
package I3 is new G3 (Null_Proc);
begin
X := Null_Proc'Access;
X := G3.Exported'Access; -- error
X := G3.Other_Renaming'Access;
end;
end;
この例の Other_Renaming
は仮引数ではなく Null_Proc
を直接 renames
していますので Null_Proc
と同じレベルと見做されOKです。
その他特記事項¶
Ada 202xでは generic
の引数に Atomic
等が指定できるようになりますが、これが深刻な非互換になるそうです。
仮引数 type T is private
に Atomic
の付いた実引数を渡せなくなるとかなんとか。
(よくわかりません。)
変更を取り消すとか仮引数とのマッチングを別AIにするとかするらしいです。 続報を待ちましょう。
関連AI¶
AI12-0079-3 Global-in and global-out annotations
AI12-0350-1 Swap for Indefinite_Holders
AI12-0359-1 Calls to subprograms declared in shared passive units
AI12-0361-1 Ada.Streams.Storage packages are still useful
AI12-0364-1 Add a modular atomic arithmetic package
AI12-0367-1 Glitches in aspect specifications
AI12-0368-1 Declare expressions can be static
AI12-0369-1 Relaxing barrier restrictions
AI12-0370-1 Pattern to use for specifying a precondition
AI12-0371-1 Fix-ups for aspects in generic formal parts
Wording Changes¶
文面のみの修正です。
AI12-0347-1 Presentation issues