From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: About String
Date: Sun, 15 Jun 2008 22:52:45 +0200
Date: 2008-06-15T22:52:47+02:00 [thread overview]
Message-ID: <12uzegqkwihil.gi8iceyncrph.dlg@40tude.net> (raw)
In-Reply-To: wccy7561obj.fsf@shell01.TheWorld.com
On Sun, 15 Jun 2008 15:38:08 -0400, Robert A Duff wrote:
> "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de> writes:
>
>> On Sun, 08 Jun 2008 17:19:11 -0400, Robert A Duff wrote:
>>
>>> I agree. I suppose it comes from Pascal, where declarations and
>>> executable code are completely separated. It makes no sense in
>>> Ada, where declarations are just as executable as statements.
>>
>> I disagree. I think it does make sense because it clearly defines the scope
>> of the declared variable. Expression (result) /= named object. And
>> reversely, if you don't need the variable, you are free to put expressions
>> anywhere outside the declaration part.
>
> If Ada allowed:
>
> for I in A'Range loop
> X : constant Character := F(A(I)); -- Not Ada!
> Do_Something(X);
> end loop;
>
> the scope of X is clear -- it's the entire loop body.
No, then it should better be something like:
for I in A'Range;
X : constant Character := F(A(I)); -- Not Ada!
loop
Do_Something(X);
end loop;
The declarative part of a loop is between "for" and "loop."
However I find nested declare/begin/end more readable because it clearly
disambiguates between the scope of the loop and the scope of one iteration
of.
> You could still say:
>
> for I in A'Range loop
> begin
> X : constant Character := F(A(I)); -- Not Ada!
> Do_Something(X);
> end;
> Do_Something_Else;
> end loop;
But what would happen if I said:
begin
raise Foo_Error;
X : constant Character := F(A(I)); -- Not Ada!
Do_Something (X);
exception
when Foo_Error =>
Do_Something_Interesting (X);
end;
---------------
What I miss is things like:
procedure Foo (X : T'Class) is
begin
case X is
when S_X : S'Class =>
Do_S_Method (S_X);
when others =>
Do_Something_Else;
end case;
end Foo;
procedure Bar (Ptr : access T'Class) is
begin
case Ptr is
when Ref : not null access T =>
Ref.Foo; -- No more checks
when others =>
null;
end case;
end Bar;
case I is
when Checked_I : A'Range =>
... A (Checked_I) ... -- No range checks
...
end case;
case L - 123 is
when Sum : Positive =>
-- Sum = L - 123 and it is positive
...
when Sum : Integer =>
-- Sum = L - 123 and it is not positive
...
when others =>
-- It would overflow, but no exception was propagated
...
end case;
--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de
next prev parent reply other threads:[~2008-06-15 20:52 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-06 17:29 About String Sébastien Morand
2008-06-07 16:18 ` Simon Wright
2008-06-07 17:01 ` Pascal Obry
2008-06-07 22:13 ` Chris Moore
2008-06-08 6:47 ` Niklas Holsti
2008-06-08 7:35 ` Dmitry A. Kazakov
2008-06-08 10:29 ` Sebastien Morand
2008-06-08 10:53 ` Dmitry A. Kazakov
2008-06-08 11:14 ` Niklas Holsti
2008-06-08 13:16 ` Dmitry A. Kazakov
2008-06-08 17:17 ` Niklas Holsti
2008-06-09 7:26 ` Dmitry A. Kazakov
2008-06-08 11:48 ` Martin
2008-06-08 13:17 ` Conditional declarations (was: About String) Dmitry A. Kazakov
2008-06-08 18:26 ` About String Chris Moore
2008-06-08 18:32 ` Robert A Duff
2008-06-08 20:51 ` Maciej Sobczak
2008-06-08 21:19 ` Robert A Duff
2008-06-09 7:14 ` Dmitry A. Kazakov
2008-06-09 9:43 ` Georg Bauhaus
2008-06-09 10:25 ` Dmitry A. Kazakov
2008-06-09 10:42 ` Sébastien Morand
2008-06-09 11:43 ` Georg Bauhaus
2008-06-09 12:03 ` Dmitry A. Kazakov
2008-06-15 19:38 ` Robert A Duff
2008-06-15 20:52 ` Dmitry A. Kazakov [this message]
2008-06-15 22:06 ` Robert A Duff
2008-06-16 8:31 ` Dmitry A. Kazakov
2008-06-16 19:17 ` Robert A Duff
2008-06-16 20:30 ` Dmitry A. Kazakov
2008-06-16 22:02 ` Georg Bauhaus
2008-06-16 23:04 ` Robert A Duff
2008-06-09 11:00 ` Georg Bauhaus
2008-06-09 14:27 ` Britt Snodgrass
2008-06-15 19:50 ` Robert A Duff
2008-06-15 19:48 ` Robert A Duff
2008-06-08 11:13 ` Simon Wright
2008-06-08 19:03 ` Sebastien Morand
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox