With Ada.Text_IO; Use Ada.Text_IO;
procedure Test is
package Example is
type My_Type is limited private;
procedure Initialize(Self : in out My_Type; Value : Integer);
procedure Print(Self : My_Type);
private
type My_Type is limited record
Value : Integer := 0;
end record;
end Example;
package body Example is
procedure Initialize(Self : in out My_Type; Value : Integer) is
begin
Self.Value := Value;
end Initialize;
procedure Print(Self : My_Type) is
begin
Ada.Text_IO.Put_Line(Self.Value'Image);
end Print;
end Example;
-- HERE: Turn the procedure into a funciton with
-- extended return syntax.
function Make (Value : Integer) return Example.My_Type is
begin
return Result : Example.My_Type do
Example.Initialize(Result,Value);
end return;
end Make;
Thing : Example.My_Type := Make(21);
begin
Example.Print(Thing);
end Test;
V2l0aCBBZGEuVGV4dF9JTzsgVXNlIEFkYS5UZXh0X0lPOyAgCgpwcm9jZWR1cmUgVGVzdCBpcwoKCXBhY2thZ2UgRXhhbXBsZSBpcwoJCQoJCXR5cGUgTXlfVHlwZSBpcyBsaW1pdGVkIHByaXZhdGU7CgoJCXByb2NlZHVyZSBJbml0aWFsaXplKFNlbGYgOiBpbiBvdXQgTXlfVHlwZTsgVmFsdWUgOiBJbnRlZ2VyKTsKCQlwcm9jZWR1cmUgUHJpbnQoU2VsZiA6IE15X1R5cGUpOwoJCQoJcHJpdmF0ZQoJCgkJdHlwZSBNeV9UeXBlIGlzIGxpbWl0ZWQgcmVjb3JkCgkJCVZhbHVlIDogSW50ZWdlciA6PSAwOwoJCWVuZCByZWNvcmQ7CgkJCgllbmQgRXhhbXBsZTsKCQoJcGFja2FnZSBib2R5IEV4YW1wbGUgaXMKCQlwcm9jZWR1cmUgSW5pdGlhbGl6ZShTZWxmIDogaW4gb3V0IE15X1R5cGU7IFZhbHVlIDogSW50ZWdlcikgaXMKCQliZWdpbgoJCQlTZWxmLlZhbHVlIDo9IFZhbHVlOwoJCWVuZCBJbml0aWFsaXplOwoJCQoJCXByb2NlZHVyZSBQcmludChTZWxmIDogTXlfVHlwZSkgaXMKCQliZWdpbgoJCQlBZGEuVGV4dF9JTy5QdXRfTGluZShTZWxmLlZhbHVlJ0ltYWdlKTsKCQllbmQgUHJpbnQ7CgllbmQgRXhhbXBsZTsKCQoJLS0gSEVSRTogIFR1cm4gdGhlIHByb2NlZHVyZSBpbnRvIGEgZnVuY2l0b24gd2l0aAoJLS0gZXh0ZW5kZWQgcmV0dXJuIHN5bnRheC4KCWZ1bmN0aW9uIE1ha2UgKFZhbHVlIDogSW50ZWdlcikgcmV0dXJuIEV4YW1wbGUuTXlfVHlwZSBpcwoJYmVnaW4KCQlyZXR1cm4gUmVzdWx0IDogRXhhbXBsZS5NeV9UeXBlIGRvCgkJCUV4YW1wbGUuSW5pdGlhbGl6ZShSZXN1bHQsVmFsdWUpOwoJCWVuZCByZXR1cm47CgllbmQgTWFrZTsKCQoJVGhpbmcgOiBFeGFtcGxlLk15X1R5cGUgOj0gTWFrZSgyMSk7CgpiZWdpbgogIEV4YW1wbGUuUHJpbnQoVGhpbmcpOwplbmQgVGVzdDs=