Ada 202x (53日目) - 10月21日の電子会議の結果 ============================================ .. post:: Oct 25, 2020 :tags: ada, ada_2022 `10月25日に行われた電子会議の議事録 `_\ が公開されました。 Put_ImageとAda.Strings.Text_Buffersの修正 ----------------------------------------- ``'Put_Image`` 属性(``'Image`` 属性)を ``Unchecked_Union`` に使った場合の挙動が ``Program_Error`` から実装依存の文字列を返すように修正されました。 ``Unchecked_Union`` はどのケースで解釈していいのか定まりませんので、例えば ``"(UNCHECKED UNION)"`` のような文字列を返すことが提案されています。 例外にされますとデバッグ出力も気楽にできませんし歓迎です。 ``Ada.Strings.Text_Buffers`` はネストされたインデント/アンインデントに対応しました。 ほとんどの宣言にアスペクトが付けられるように -------------------------------------------- なりました。 discriminantでしたり拡張return文の返値用オブジェクトでしたり。 隅から隅まで。 むしろどの宣言がアスペクトを付けられないままにされているのかを見ていったほうがわかりやすいと思います。 アスペクトが付けられない宣言 ++++++++++++++++++++++++++++ - incomplete型。 - ``generic`` の引数としてのincomplete型。 - 列挙型の要素。 ``type T is (A, B with Inline, Pack, C);`` みたいに書いたときに ``Pack`` がアスペクトなのか要素なのか曖昧になります。 - parallel for文のチャンク。 - for文その他のインデックスやprocedural iteratorのパラメータ等。 - 例外ハンドラで受け取るパラメータ。 (``... exception when E : others => ...`` の ``E`` のことです。) 列挙型の要素は文法が曖昧になるのが理由であり用途が考えられるだけに残念です。 (内部表現や ``'Image`` の結果を指定する等) 後は妥当でしょう。 Preelaborable_Initializationアスペクト -------------------------------------- pragma ``Preelaborable_Initialization`` がアスペクトとしても書けるようになりました。 これまでアスペクト化が阻まれていた理由としましてはアスペクトは可視性によって変化しないと決められていたからだそうです。 ``Preelaborable_Initialization`` の性質は可視性の影響を受けます。 .. code-block:: ada package Pkg1 with Preelaborate is type T is private; private type T is new Integer; end Pkg1; package Pkg1.Child with Preelaborate is A : T; -- error private B : T; -- ok end Pkg1.Child; 抽象型 ``Pkg1.T`` は中身が見えない箇所からは実行時の初期化が必要かどうかは不明として扱われ、中身が見える箇所からは実行時の初期化は不要とわかります。 pragma ``Preelaborable_Initialization`` は中身が見えなくても実行時の初期化が不要ですよとコンパイラに伝えます。 .. code-block:: ada package Pkg1 with Preelaborate is type T is private; pragma Preelaborable_Initialization (T); ... これで ``A`` の宣言もコンパイルできるようになります。 このpragmaを付けていない場合が問題で、可視性によって ``Preelaborable_Initialization`` かどうかが切り替わっています。 アスペクトにしてしまいますと同じ型なのに可視性で ``False`` から ``True`` に切り替わる謎アスペクトになってしまいます。 これまではこのようなアスペクトは認められていませんでしたが、例外的にOKということにして ``Preelaborable_Initialization`` がアスペクトとしても書けるようになりました。 .. code-block:: ada package Pkg1 with Preelaborate is type T is private with Preelaborable_Initialization => True; ... うーむ? Append_One廃止とAppendのオーバーロードの分割 -------------------------------------------- ``Vectors`` と ``Doubly_Linked_Lists`` に追加される予定でした ``Append_One`` が廃止されます。 やっぱり不格好と思われていたようで……。 代わりに ``Append`` が要素型を取る版とコンテナ自体の型を取る版でオーバーロードされていたのが分割されて後者が ``Append_Vector`` になります。 そもそもの問題はコンテナがユーザー定義aggregate式で書けるようになったせいで ``Append (Container, (1, 2));`` みたいな呼び出しで ``(1, 2)`` が要素型としてもコンテナ自体としても解釈可能な場合が出てしまったことでした。 曖昧さのない ``Append_One`` を追加するか ``Append`` 自体から曖昧さを取り除くかの2択です。 ここまで互換性重視で前者の流れで来ていましたがこの土壇場に来てひっくり返りました。 Ada2005、2012とは非互換になり ``Vectors.Append`` でコンテナ自体を追加していたコードは ``Append_Vector`` に書き換える必要があります。 (``Doubly_Linked_Lists.Append`` の方は元からオーバーロードはされていませんでした。 単に ``Append_One`` の追加が取り消されるだけです。) ……過去記事の修正点多い……めんどくさい……。 :doc:`6日目 `\ 、\ :doc:`10日目 `\ 、\ :doc:`35日目 `\ 、\ :doc:`非互換性 `\ 、\ :doc:`52日目 `\ を修正しました。 ``Ada.Strings.Bounded`` や ``Ada.Strings.Unbounded`` にも同様にオーバーロードされた ``Append`` はあるわけで、もし ``String_Literal`` や ``Aggregate`` アスペクトが追加されるようなことがあれば同様の修正が必要になると思われます。 Qualified式のrenames -------------------- 任意の値が ``renames`` できるようになってしまったことに関して早速問題点が見つかってます。 .. code-block:: ada declare X : Integer := 1; Y : Positive renames Positive'(X); begin X := -1; 型を範囲を指定した ``subtype`` に変えながら ``renames`` した後で元の変数を書き換えたらどうなるのでしょうか? というわけで変数の型を変えながらの ``renames`` はコンパイルエラーになりました。 エラーになるのは変数のみで定数や一時オブジェクト(式や関数の結果)でしたらOKです。 .. code-block:: ada declare X : Integer := 1; Y : Positive renames Positive'(+X); -- 単項 "+" の返す一時オブジェクト begin X := -1; -- Yは1のまま その他文面等の修正 ------------------ 例によって文面等の修正がまとめてひとつのAIで行われています。 関連AI ------ - `AI12-0384-2`_ **Fixups for Put_Image and Text_Buffers** - `AI12-0398-1`_ **Most declarations should allow aspect specifications** - `AI12-0399-1`_ **Aspect specification for Preelaborable_Initialization** - `AI12-0400-1`_ **Ambiguities associated with Vector Append and container aggregates** - `AI12-0401-1`_ **Renaming of a qualified expression of a variable** - `AI12-0403-1`_ **Presentation issues from Draft 26 review** .. _`AI12-0384-2`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0384-2.txt .. _`AI12-0398-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0398-1.txt .. _`AI12-0399-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0399-1.txt .. _`AI12-0400-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0400-1.txt .. _`AI12-0401-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0401-1.txt .. _`AI12-0403-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0403-1.txt