comp.lang.ada
 help / color / mirror / Atom feed
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



  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