Ada 2020 (57日目) - 6月3日の電子会議の結果

6月3日に行われた電子会議の議事録が公開されました。

前回は「次は3月」って書いてたじゃないですかあ。 56日目がフライングになってしまいました。 重複分は省きます。

次回こそは未定で「次のステップ」に進むようです。

変換しての代入とpredicate

型変換しての代入に、元の値のチェックが行われなくなります。

declare
   subtype Negative is Integer with Dynamic_Predicate => Negative < 0;
   X : Integer := 1;
begin
   Negative (X) := -1;

従来は

  1. 元の値(1)が Negative の条件を満たしているかチェック

  2. -1 を代入

  3. 新しい値(-1)が Negative の条件を満たしているかチェック

が行われていました。 A. のチェックが行われなくなります。

outパラメータに入った変更と同じような話ですね。 38日目を参照。

ただし @ が使われている場合はチェックされます。

declare
   subtype Negative is Integer with Dynamic_Predicate => Negative < 0;
   X : Integer := 1;
begin
   Negative (X) := -@; -- Constraint_Error

Cursorの “=”

これまで各コンテナの Cursor"=" 演算子は既定義のものをそのまま使わなければならないとされていました。 ユーザー定義しても構わなくなります。

元々守られていたルールにも思えませんしほぼ気にする必要はないはずです。 しかしユーザー定義されていても in 等で既定義の演算子が使われる場合もありますので変なことをしていますとレアな非互換性に悩まされそうな気がしないでもないです。 (レアなバグに遭遇する自信がある人)

parallel do文の例外ハンドラ

これまでの仕様では parallel do 文でも例外ハンドラが書けるようになっていました。 元々 do end do ではなく begin end が検討されていた名残りです。

インデントが見辛くなりますし将来良いスタイルが見つかった時に負の遺産を残さないためAda 2020の時点では例外ハンドラは書けなくなります。 将来解禁される可能性はあります。

declare
   X : Integer;
   Y : Ada.Strings.Unbounded.Unbounded_String;
begin
   parallel do
      X := Integer'Value ("THIS-IS-NON-INTEGER");
   exception -- error
      when Constraint_Error =>
         X := 0;
   and
      Y := Ada.Strings.Unbounded.To_Unbounded_String
             (Ada.Directories.Containing_Directory ("/"));
   exception -- error
      when Use_Error =>
         Y := Ada.Strings.Unbounded.Null_String;
   end do;

次のように書く必要があります。

declare
   X : Integer;
   Y : Ada.Strings.Unbounded.Unbounded_String;
begin
   parallel do
      begin
         X := Integer'Value ("THIS-IS-NON-INTEGER");
      exception
         when Constraint_Error =>
            X := 0;
      end;
   and
      begin
         Y := Ada.Strings.Unbounded.To_Unbounded_String
                (Ada.Directories.Containing_Directory ("/"));
      exception
         when Use_Error =>
            Y := Ada.Strings.Unbounded.Null_String;
      end;
   end do;

それから parallel do 文でもチャンクが宣言できるようになるとかならないとか?

その他文面やサンプルコード等の修正

例によって文面やサンプルコード等の修正が複数のAIで行われています。

関連AI

  • AI12-0428-1 “Same declaration list” requirement too strong for private types

  • AI12-0429-1 Examples should have consistent lead-ins

  • AI12-0431-1 Confirming predicate shouldn’t change semantics

  • AI12-0432-1 View conversions of assignments and predicate checks

  • AI12-0433-1 The Simple_Name of a root directory revisited

  • AI12-0434-1 Equality operators for container cursors

  • AI12-0435-1 Fixups from WG 9 Issue #143 - Image and streams

  • AI12-0436-1 Should parallel blocks include exception handlers?