Ada 202x (47日目) - 1月15日の電子会議の結果

1月15日に行われた電子会議の議事録が公開されました。 結果これまで書いたことに訂正が必要になりましたので47日目です。

'Reduce/'Parallel_Reduce属性の第3引数の削除

第3引数(Combiner)が取りやめになりました。

第3引数は結果の型同士を畳み込むサブプログラムを指定する引数でした。 それが削除されましたので畳み込む要素の型と結果の型が異なる場合には並列化できないということになります。

その代わりに parallel 付きのaggregate式が 'Reduce 属性との組み合わせだけでなくどこでも使えるように一般化される、かもしれません。 そうなればユーザー定義型を通じて同じようなこともできますし応用範囲も広くなります。 そちらはまだ議論中です。

10日目を修正しました。

System.Storage_Pools.Subpoolsへの変更

System.Storage_Pools.Subpools.Root_Storage_Pool_With_SubpoolsPreelaborable_Initialization になりました。

Preelaborable_Initialization は動的な初期化を必要としない型です。 サブプール付きのストレージプールを Preelaborate パッケージの中でグローバル変数として配置できることになります。

このように規格の更新の度にどんどんと標準ライブラリは初期化が不要になっていっています。 (その分実装難易度は上がるわけです……。)

35日目に追記しました。

ユーザー定義リテラルのルール

通常の関数呼び出し同様になりました。

大きい修正として、派生先で再定義可能になりました。 つまり上書き不可能(nonoverridable)ではなくなりました。

静的な型に従って解決され動的ディスパッチはされません。

41日目を修正しました。

拡張return文で作成中の返値のチェック

これまで拡張return文の返値オブジェクトのチェックは実際に関数を抜ける時に行われていました。つまり拡張return文の中では未チェックのオブジェクトが存在できてしまっていました。

各種チェックのタイミングが修正されます。

aliased引数のAccessibility_Check

これまでaliased引数の Accessibility_Check に際して生存期間はレキシカルにそのサブプログラムよりも1段広いものとして扱われていました。 対して匿名のaccess型の生存期間は実行時の実際のものが使われていました。

aliased引数の生存期間も実行時の実際のものが使われるようになります。

これによって自由度は増しました。

しかしですね、実際の生存期間を使ってチェックを行うには隠しパラメータとして渡されるしかないわけですよ。 これまで本当は匿名のaccess型にしたいけれども隠しパラメータを追加されたくない場合はaliased引数にするテクニックが使えていましたのに……。

隠しパラメータはABIに関わりますのでpragma Suppress でも使わなくなるだけで隠しパラメータの存在自体は消せません。 今後は隠しパラメータを追加されたくなければ名前付きaccess型と 'Unchecked_Access を使うことになるのでしょうか。

genericの引数のStatic_Predicate

generic の仮引数と実引数のサブタイプ関係のチェックに Static_Predicate も含められます。

subtype Nonzero_Float is Float
  with Static_Predicate => Nonzero_Float /= 0;

generic
   type T is new Nonzero_Float;
package G is
end G;

package Instance is new G (Float); -- error

untagged型を派生した後からの"="の再定義

untagged型の "=" 演算子について、派生を挟むと後からの再定義がエラーになります。

declare
   type B is null record;
   type D is new B;
   overriding function "=" (Left, Right : B) return Boolean; -- error

D の既定義の =B= を必要とします。 D の宣言時点では B の既定義の = が見えています。 後から実装を差し替えることはできないということですね。

tagged型についてはOKです。

untagged型の = の振る舞いをなるべくtagged型に近づけようとするAda 2012の変更で一度はOKになっていたものが再度禁止されました。

その他特記事項

Unify record syntaxに対する議論が再燃

私が思っていたのと同じようなことを委員会の方々も思っていたようで議論が再燃しました。

メーリングリストでは中止派が圧倒的多数でしたが、ミーティング参加者による投票の結果現状維持つまりドラフト入りしたままとなりました。 一度ドラフト入りしたものを覆すのは難しいようです。

関連AI

  • AI12-0342-1 Various issues with user-defined literals (part 2)

  • AI12-0343-1 Return Statement Checks

  • AI12-0345-1 Dynamic accessibility of explicitly aliased parameters

  • AI12-0348-1 Remove Combiners from Reduction Expressions

  • AI12-0351-1 Matching for actuals for formal derived types

  • AI12-0352-1 Early derivation and equality of untagged types

  • AI12-0356-1 Root_Storage_Pool_With_Subpools should have Preelaborable_Initialization

次回会議

次回は6月に実際にスペインで行われるようです。