From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Discriminant name must be alone
Date: Mon, 23 Dec 2002 12:21:29 +0100
Date: 2002-12-23T12:21:29+01:00 [thread overview]
Message-ID: <au6rj7$4sp8p$1@ID-77047.news.dfncis.de> (raw)
In-Reply-To: wccadiz0y2j.fsf@shell01.TheWorld.com
Robert A Duff wrote:
> However, I have run into a few cases where I would like to do what
> you're suggesting here. For example, I wrote a "storage pool" type,
> where the private part defined the storage as an array of machine words.
> The allocated types were known to be always word aligned, and always a
> multiple of word size. The array of words makes alignment easy, and the
> Allocate procedure can simply return 'Address of one of the array
> components. But I wanted the client to specify the size in
> Storage_Elements. So the array would have to be:
>
> Storage: Word_Array(0..(Size_In_Bytes-1)/4); -- Illegal!
>
> where Size_In_Bytes is the discriminant. Or something like that.
>
> I think the main problem with allowing that (besides what the AARM
> mentions) is that if you allow arbitrary expressions referring to
> discriminants, you have to worry about when that expression is
> evaluated. Suppose that expression is "F(Size_In_Bytes)", where F is
> some function that might have side effects. If it has side effects, it
> might return a different answer each time it's called.
>
> I suppose one answer is to say that the expression is evaluated whenever
> a value of the record type is created. The value of that expression
> must be saved as "dope" -- a hidden record component created by the
> compiler. If it has side effects, that's the programmer's problem.
> This would be the first case where a compiler is required to store
> dope. Some compilers store dope, but it's never required.
>
> Another answer is, "forbid side effects in those expressions", so the
> compiler can evaluate those expressions whenever it likes. Ada has no
> such mechanism, currently. To provide such a mechanism, each function
> would have to declare (on the spec) what variables it meddles with --
> as in SPARK. If the expression "Start_Ind + 10" is allowed, then surely
> you should be allowed to call a function that does "return Start_Ind +
> 10;".
There is a third answer: "user-defined constructors". Should you have a
user-defined constructor for a discriminated type, you could evaluate its
discriminants during object construction, which would have same effect as
if they were expressions (with the arguments provided by the constructor's
argument list).
User-defined constructors could also solve the "assignment problem", because
an assignment can be easily generated out of copy-constructor.
--
Regards,
Dmitry A. Kazakov
www.dmitry-kazakov.de
next prev parent reply other threads:[~2002-12-23 11:21 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-12-21 19:22 Discriminant name must be alone Michal Nowak
2002-12-21 23:08 ` Robert A Duff
2002-12-23 11:21 ` Dmitry A. Kazakov [this message]
2002-12-23 14:00 ` Robert A Duff
2002-12-24 11:16 ` Dmitry A. Kazakov
2002-12-25 14:29 ` Michal Nowak
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox