レコード(とか配列とか)の要素に文字列を入れる場合の定石が分からなくて困る。
String(1 .. 512)派Ada.Strings.Unbounded.Unbounded_String派access String派access出来るようになったらしい。この場合allは無くてもaliasedな'Addressを受け取れる。OOPとの相性は良い?制約しないとreocrdの要素につっこめないのが不便なんだよな。副プログラムのパラメタは普通Stringで宣言するからUnboundedだと変換がめどい。かといってaccessでも'Addressとか.allがそのたびに必要になるんだよな。それにしてもAda.Strings.Boundedは使い道無いなぁ。
protected内のprivateな部分に型の定義を宣言することは出来ないのだが、これが微妙にイライラする。
with Ada.Containers.Indefinite_Doubly_Linked_Lists;
package Message_Buffers is
type Private_Buffer is private; -- 別に公開したくない
protected type Message_Buffer is
entry Write(Item : String);
entry Read(Item : out String);
private
-- ここに書けない!
-- type String_Access is access all String;
-- package String_Access_Lists is new Ada.Containers.Indefinite_Doubly_Linked_Lists(String_Access);
Buffer : Private_Buffer;
end Message_Buffer;
private
type String_Access is access all String;
package String_Access_Lists is new Ada.Containers.Indefinite_Doubly_Linked_Lists(String_Access);
type Private_Buffer is new String_Access_Lists.List with null record; -- ずいぶん冗長なことに
end Message_Buffers;
Private_Buffer自体は内部でしか使わないので、外に公開したくな。しかし、Message_Bufferを公開する以上、それに先だって宣言しなければエラーとなる。privateだけ分割できないものか。