From: Georg Bauhaus <bauhaus@futureapps.de>
Subject: Re: Constant record components
Date: Sun, 02 Jul 2006 11:18:24 +0200
Date: 2006-07-02T11:17:11+02:00 [thread overview]
Message-ID: <44a78f17$0$29122$9b4e6d93@newsread4.arcor-online.net> (raw)
In-Reply-To: <J0Cpg.1052504$xm3.347020@attbi_s21>
Jeffrey R. Carter wrote:
> Ada.Text_IO.Put_Line ("Component is not constant");
> You get 3 guesses which string is output, and the 1st 2 don't count.
> Clearly, this does not meet the OP's interest in components that cannot
> be changed after initialization.
Not sure whether it is clear that the OP wanted records initialized
twice, as in
A : Rec.R := Rec.Make (1);
begin
A := Rec.Make (2);
To enforce the contract of the constructor function `make` ("call once
for each object") and still not making the records or a component limited
how about this workaround then:
package Rec is
type R is tagged private;
procedure make(m: INTEGER; result: in out R);
-- `m` is the initial value for the immutable component
-- pre: result has not been initialized
function immutable(thing: R) return INTEGER;
private
type R is tagged record
mutable: INTEGER;
data: INTEGER;
identity: POSITIVE'base := 0;
end record;
end Rec;
Imagine a protected Sequence in the body that generates unique
positive values for the .identity part of R. Make raises Program_Error
whenever called with a Result that has .identity /= 0.
A limited component Immutable looks like another option to me.
(Yes, there are no immutable non-limited components other than
discriminants, but possibly there is a solution, sort of,
that works reasonably well even though it takes some space?)
next prev parent reply other threads:[~2006-07-02 9:18 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <12ad8guf3sg1o0d@corp.supernews.com>
2006-07-01 17:06 ` Constant record components Dmitry A. Kazakov
2006-07-01 17:37 ` ME
2006-07-01 18:33 ` Georg Bauhaus
2006-07-01 21:44 ` Jeffrey R. Carter
2006-07-02 9:18 ` Georg Bauhaus [this message]
2006-07-02 16:13 ` ME
2006-07-03 7:50 ` Dmitry A. Kazakov
2006-07-03 11:46 ` Craig Carey
2006-07-04 0:06 ` M E Leypold
2006-07-03 16:31 ` ME
2006-07-03 23:53 ` Randy Brukardt
2006-07-04 1:59 ` Craig Carey
2006-07-04 7:25 ` ME
2006-07-05 21:55 ` Randy Brukardt
2006-07-06 0:59 ` tmoran
2006-07-06 7:47 ` Jean-Pierre Rosen
2006-07-06 22:29 ` Randy Brukardt
2006-07-07 4:34 ` Jeffrey R. Carter
2006-07-07 5:39 ` ME
2006-07-07 9:15 ` Georg Bauhaus
2006-07-08 16:13 ` ME
2006-07-08 17:14 ` Georg Bauhaus
2006-07-13 6:58 ` ME
2006-07-13 8:39 ` Georg Bauhaus
2006-07-07 21:04 ` Randy Brukardt
2006-07-14 8:15 ` Craig Carey
2006-07-14 12:51 ` Craig Carey
2006-07-15 3:45 ` ME
2006-07-04 0:08 ` M E Leypold
2006-07-02 5:52 ` Craig Carey
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox