Ada 202x (55日目) - 1月20日の電子会議の結果 =========================================== .. post:: Jan 31, 2021 :tags: ada, ada_2022 .. role:: strike `1月20日に行われた電子会議の議事録 `_\ が公開されました。 Interfaces.C.bool ----------------- 追加されます。 C言語の ``_Bool`` に対応する型です。 宣言は :strike:`type bool is new Boolean;` ``type C_bool is new Boolean;`` に ``_Bool`` 互換となるよう実装依存の内部表現が指定される形です。 ``Boolean`` からの派生ですので真偽値は ``True`` と ``False`` を継承しています。 えっ、まだ規格に入ってなかったの? :doc:`35日目 `\ に追記しました。 Pre'Classからのabstract関数の呼び出し ------------------------------------- abstract関数を ``Pre'Class`` の中で呼び出せるようになります。 .. code-block:: ada package Pkg1 is type T is abstract tagged null record; function P (Object : T) return Boolean is abstract; procedure Do_Something (Object : in T) is abstract with Pre'Class => P (Object); end Pkg1; これまではabstract関数 ``P`` はここで使用できませんでした。 .. container:: gray-and-small Ada 2012 Technical Corrigendum 1以前は ``Pre'Class`` の中での呼び出しは多態していたためエラーにはなりませんでした。 以降も明示的に ``P (T'Class (Object))`` のように多態させれば可能ではありました。 ただし事前条件を多態させてしまいますと派生型の側で置換原則を守らないようにもできてしまいますので注意が必要です。 この ``T`` から派生してインスタンス化可能な型 ``D`` を作ってみます。 .. code-block:: ada with Pkg1; package Pkg2 is type D is new Pkg1.T with null record; overriding function P (Object : T) return Boolean is (True); overriding procedure Do_Something (Object : in T) is null; -- Pre'Class => P (Object) end Pkg1; ``D`` の ``Do_Something`` の事前条件は ``Pkg2.P (Object)`` となります。 :doc:`26日目 `\ で述べたように ``T`` がabstract型でなければ ``Pkg1.P (Pkg1.T (Object)) and Pkg2.P (Object)`` となりますが、abstract型は飛ばされますので ``Pkg2.P (Object)`` だけとなります。 これに伴い、このような事前条件を持つプリミティブはabstract型のclass-wide型からの多態呼び出しが禁止されました。 事前条件は多態しないからです。 .. code-block:: ada declare Object : Pkg1.T'Class := Pkg2.D'(null record); begin Pkg1.Do_Something (Object); -- error 勿論abstract型ではない ``Pkg2.D'Class`` 型からの多態呼び出しはできます。 pragma Pure/Preelaborate ------------------------ pragma ``Pure`` と ``Preelaborate`` がobsolescentになります。 これに限らず同名のアスペクトが用意されたものはpragmaではなくアスペクトを使っていったほうが良いでしょう。 .. container:: gray-and-small 個人的にはpragmaの宣言から離して書ける利点も捨てがたいとは思っています。 pragma ``Inline`` 等のセマンティクスに影響を与えないものは離して書きたいです。 アスペクトの分類 ---------------- 型に付く各アスペクトについて、 ``Integer_Literal`` や ``Size`` 等は派生先で再定義可能、 ``Constant_Indexing`` 等は再定義不可能、 ``Stable_Properties`` 等は継承されない、 ``Put_Image`` や ``Write`` 等は継承元の定義を使用する形で再構成される、みたいに派生先でどうなるかはまちまちでした。 整理のため3種類に分類されます。 - implicitly composed 直接は継承されませんが派生元の値を使って再構成されます。 ``Put_Image`` 、 ``Read`` や ``Write`` 等。 - additive 直接は継承されませんが動作は引き継がれます。 ``Default_Initial_Condition`` 、 ``Static_Predicate`` や ``Type_Invariant'Class`` 等。 - nonoverridable 継承され再定義できません。 ``interface`` 間で衝突します。 ``Constant_Indexing`` や ``Integer_Literal`` 等。 なんかどさくさでユーザー定義リテラルがnonoverridableに分類されて再び再定義不可能になっている気がします。 :doc:`41日目 `\ と :doc:`47日目 `\ を修正しました。 定数の要件 ---------- 幾つかの場所で定数かどうかの判定に「variable viewを持たないこと」が加えられます。 (variable viewは :doc:`20日目 `\ で説明した変更可能な定数を作るテクニックです。) 例えばグローバル定数にアクセスしているだけでは ``Global`` アスペクトに書く必要はありませんが、その定数がvariable viewを持っていると書く必要があります。 標準のストレージプール ---------------------- 標準のストレージプールを非同期に呼び出した場合に衝突は起こらないことが明記されます。 これまではブロッキングしないことだけが書かれていました。 その他文面等の修正 ------------------ 例によって文面等の修正が複数のAIで行われています。 関連AI ------ - `AI12-0411-1`_ **Add "bool" to Interfaces.C** - `AI12-0412-1`_ **Abstract Pre/Post'Class on primitive of abstract type** - `AI12-0416-1`_ **Fixups from Draft 26 review - part 2** - `AI12-0417-1`_ **Make categorization pragmas obsolescent** - `AI12-0418-1`_ **Presentation issues from Draft 26 review - part 3** - `AI12-0419-1`_ **Aspect inheritance and reemergence** - `AI12-0422-1`_ **When is a constant known-on-entry?** - `AI12-0423-1`_ **Aspect inheritance fixups** - `AI12-0424-1`_ **Concurrency and the standard storage pool** .. _`AI12-0411-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0411-1.txt .. _`AI12-0412-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0412-1.txt .. _`AI12-0416-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0416-1.txt .. _`AI12-0417-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0417-1.txt .. _`AI12-0418-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0418-1.txt .. _`AI12-0419-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0419-1.txt .. _`AI12-0422-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0422-1.txt .. _`AI12-0423-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0423-1.txt .. _`AI12-0424-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0424-1.txt