Ada conference, Ada and Spark

Meta jared771 at gmail.com
Wed Feb 19 17:15:13 PST 2014


On Wednesday, 19 February 2014 at 23:55:16 UTC, bearophile wrote:
> Integral ranges and strong types:
>
>
> type Age   is range 0..125;
> type Floor is range -5 .. 15;

Is it possible to implement this using the information that's 
already available through Value Range Propagation? I think I 
remember Andrei describing it in TDPL as numeric values carrying 
around their ranges at compile time, but I don't remember exactly.

> My_Age  : Age;
> My_Floor : Floor;
> ...
> My_Age   := 10;       -- OK
> My_Floor := 10;       -- OK
> My_Age   := My_Floor; -- FORBIDDEN !

How close do you think std.typecons.Typedef is to supporting this 
functionality? Is it a sufficient replacement?

> Discriminated types:
>
>
> ype Major  is (Letters, Sciences, Technology);
> type Grade is delta 0.1 range 0.0 .. 20.0;
> type Student_Record (Name_Length : Positive;
>                      With_Major  : Major)
> is record
>    Name    : String(1 .. Name_Length); --Size depends on 
> discriminant
>    English : Grade;
>    Maths   : Grade;
>    case With_Major is     -- Variant part, according to 
> discriminant
>       when Letters =>
>          Latin : Grade;
>       when Sciences =>
>          Physics   : Grade;
>          Chemistry : Grade;
>       when Technology =>
>          Drawing : Grade;
>    end case;
> end record;

Ditto, except for with std.variant.Algebraic. It does need some 
work, but I think the important part is whether it's 
implementable in the library with a nice syntax. Then it only 
requires somebody to do the necessary work.

> Low level description of a record:
>
>
> type BitArray is array (Natural range <>) of Boolean;
> type Monitor_Info is
>     record
>         On     : Boolean;
>         Count  : Natural range 0..127;
>         Status : BitArray (0..7);
>     end record;
> for Monitor_Info use
>     record
>         On     at 0 range 0 .. 0;
>         Count  at 0 range 1 .. 7;
>         Status at 0 range 8 .. 15;
>     end record;

Isn't this the same as a struct?

> Static predicates (related to the "enum preconditions" I 
> suggested for D):
>
>
> procedure Seasons is
>     type Months is (Jan, Feb, Mar, Apr, May, Jun,
>                     Jul, Aug, Sep, Oct, Nov, Dec);
>     subtype Summer is Months
>         with Static_Predicate => Summer in Nov .. Dec |
>                                            Jan .. Apr;
>     A_Summer_Month : Summer;
> begin
>     A_Summer_Month := Jul;
> end Seasons;
>
>
> The code gives:
>
> warning: static expression fails static predicate check on 
> "Summer"

What are the limitations on what Static_Predicate can verify? It 
seems like this could be quite powerful, but not as powerful as 
runtime checks, since not everything can be checked at compile 
time.

> A kind of set syntax:
>
>
> elsif First and then C in '+' | '0' .. ’9’ then

I think this would be quite easy to do using mixins. I've also 
been thinking about list comprehensions a la Python, done with 
mixins.

> Loop variants and invariants:
>
>
> procedure Loop_Var_Loop_Invar is
>    type Total is range 1 .. 100;
>    subtype T is Total range 1 .. 10;
>    I : T := 1;
>    R : Total := 100;
> begin
>    while I < 10 loop
>       pragma Loop_Invariant (R >= 100 - 10 * I);
>       pragma Loop_Variant (Increases => I,
>                            Decreases => R);
>       R := R - I;
>       I := I + 1;
>    end loop;
> end Loop_Var_Loop_Invar;

This is a neat feature. I thought it was unique to Wiley, but I 
guess the creator of Wiley must've got it from Ada. Does the loop 
break if the invariant fails, or does it stop the program?

> An example in Spark, to clarify access to global variables (for 
> D I suggested a simpler optional @outer() attribute: 
> https://d.puremagic.com/issues/show_bug.cgi?id=5007 ):
> ...

I don't think this is quite as important, seeing as D has the 
pure keyword.


More information about the Digitalmars-d mailing list