From: Adam Beneschan <adam@irvine.com>
Subject: Re: When a conditional expression is static, where can it be used?
Date: Wed, 30 Jun 2010 13:16:00 -0700 (PDT)
Date: 2010-06-30T13:16:00-07:00 [thread overview]
Message-ID: <ee11494c-fc70-48cb-9fc9-bb64358533da@x24g2000pro.googlegroups.com> (raw)
In-Reply-To: 1nwqh57og805t.1tih31ltv91dp$.dlg@40tude.net
On Jun 30, 1:00 pm, "Dmitry A. Kazakov" <mail...@dmitry-kazakov.de>
wrote:
> On Wed, 30 Jun 2010 12:12:17 -0700 (PDT), Adam Beneschan wrote:
> > On Jun 30, 10:35 am, "Dmitry A. Kazakov" <mail...@dmitry-kazakov.de>
> > wrote:
> >> On Wed, 30 Jun 2010 07:39:24 -0700 (PDT), Adam Beneschan wrote:
> >>> On Jun 30, 3:39 am, Georg Bauhaus <rm.dash-bauh...@futureapps.de>
> >>> wrote:
> >>>> A totally meaningless example just to illustrate
> >>>> the question: What is it that a compiler must report
> >>>> for the case statement below, if anything?
>
> >>> The choice "Sa" is not covered by any alternative. Other than that, I
> >>> don't think there's anything wrong with the CASE statement, and if you
> >>> had included a "when others =>" alternative I think it would be
> >>> legal. I'm not sure what potential problem you were trying to
> >>> illustrate.
>
> >> Let me propose this one instead:
>
> >> type DOW is (Mo, Tu, We, Th, Fr, Sa, So);
>
> >> case D is
> >> when (if D = Mo then Tu else Mo) => P;
> >> when (if D = Tu then Tu else Mo) => Q;
> >> when We..So => R;
> >> end case;
>
> >> The above is equivalent to:
>
> >> case D is
> >> when Tu => P;
> >> when Mo => Q;
> >> when We..So => R;
> >> end case;
>
> >> But as Pascal suggested, it should not compile because D is not static.
>
> > Ummm, not quite, because (1) Pascal didn't say anything about *why* he
> > thought it shouldn't compile (his entire statement was "This should
> > not compile I would say"), and (2) in the OP's original example, D
> > *is* static. In your example, you're right that it shouldn't compile
> > because D is not static, but that's a different issue. (Well, I
> > *assume* D isn't static. Since your example doesn't include a
> > declaration of D, I can't tell.)
>
> So, if D is static, then all choices are defined and do not overlap, hence
> it must compile. Right?
No; it depends on what D is. On looking over your post more
carefully, I'm beginning to think you accidentally left out some key
information, or made some other error. You said earlier:
> >> case D is
> >> when (if D = Mo then Tu else Mo) => P;
> >> when (if D = Tu then Tu else Mo) => Q;
> >> when We..So => R;
> >> end case;
>
> >> The above is equivalent to:
>
> >> case D is
> >> when Tu => P;
> >> when Mo => Q;
> >> when We..So => R;
> >> end case;
Those are equivalent only if D is static and is equal to Mo. If D=Tu,
then it's equivalent to
case D is
when Mo => P;
when Tu => Q;
when We..So => R;
end case;
If D is anything else, then it's equivalent to
case D is
when Mo => P;
when Mo => Q;
when We..So => R;
end case;
which of course will not compile.
> >> As for the problem Georg had in mid. Maybe it is this. Let you have some
> >> function, say Gamma function. Now,
>
> >> x : constant := 0.1;
> >> Gx : constant := Gamma (1.1); -- Illegal, what a pity
>
> >> Let us open the table of Gamma, scan it, and write something like:
>
> >> (if x < 0.0 then ... elsif x < 0.01 then ... )
>
> >> This wonderful static function can then copied and pasted everywhere you
> >> wanted to evaluate Gamma at compile time. Is it legal?
>
> > Gamma cannot be a static function (4.9(18-22)). You cannot write a
> > static function (other than an enumeration literal, which is
> > technically a static function).
>
> Now I do not understand you. The expression I gave is an if-operator with
> only constants in it.
No, the expression you gave was an if-operator with a bunch of
ellipses in it. I had no idea what you meant by it, and you were
talking about a function named Gamma. Please excuse me if I had
trouble figuring out what you were trying to say.
> I presume it is static. E.g., simplified:
>
> x : constant := 2.0;
> Gx : constant := (if x <= 1.0 then 1.0 elsif x <= 2.0 then 2.0 elsif x
> <= 6.0 then 9.0 else 24.0);
>
> We could even add linear or quadratic interpolation between the points.
OK, that expression is legal, and Gx is a static constant that can be
used anywhere. I don't see any relationship to Georg's question, nor
what point anybody is trying to make.
-- Adam
next prev parent reply other threads:[~2010-06-30 20:16 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-06-30 10:39 When a conditional expression is static, where can it be used? Georg Bauhaus
2010-06-30 11:25 ` Pascal Obry
2010-06-30 14:39 ` Adam Beneschan
2010-06-30 17:35 ` Dmitry A. Kazakov
2010-06-30 19:12 ` Adam Beneschan
2010-06-30 20:00 ` Dmitry A. Kazakov
2010-06-30 20:16 ` Adam Beneschan [this message]
2010-07-01 17:04 ` Pascal Obry
2010-06-30 20:05 ` Georg Bauhaus
2010-06-30 20:29 ` Adam Beneschan
2010-06-30 20:45 ` Dmitry A. Kazakov
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox