dzisiaj zapytałem na liście mailingowej D, czy można definiować i używać niestandardowych typów danych w sposób podobny do np. Przykład z Ady wiki strony:Typy Ada w Nimrod
type Day_type is range 1 .. 31;
type Month_type is range 1 .. 12;
type Year_type is range 1800 .. 2100;
type Hours is mod 24;
type Weekday is (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);
type Date is
record
Day : Day_type;
Month : Month_type;
Year : Year_type;
end record;
subtype Working_Hours is Hours range 0 .. 12;
subtype Working_Day is Weekday range Monday .. Friday;
Work_Load: constant array(Working_Day) of Working_Hours
:= (Friday => 6, Monday => 4, others => 10);
i reply wykazały coś takiego:
import std.typecons;
import std.exception;
struct Limited(T, T lower, T upper)
{
T _t;
mixin Proxy!_t; //Limited acts as T (almost)
invariant()
{
enforce(_t >= lower && _t <= upper);
}
this(T t)
{
_t = t;
}
}
auto limited(T, T lower, T upper)(T init = T.init)
{
return Limited!(T, lower, upper)(init);
}
unittest
{
enum l = [-4,9];
auto a = limited!(int, l[0], l[1])();
foreach(i; l[0] .. l[1]+1)
{
a = i;
}
assertThrown({a = -5;}());
assertThrown({a = 10;}());
}
który pokazuje, że to możliwe, ale prawdopodobnie nie zdobywa elegancję Ady.
Teraz, po przeczytaniu ostatnio o Nimroda, zastanawiam się, jak poradzi sobie z podobnym zadaniem z zapewnieniem bezpieczeństwa tego samego Ada?
Dziękuję. Araq opublikował także na #ada, gdzie mieliśmy małą dyskusję. Nie wiedziałem, że Nimrod robi to tak elegancko jak Ady i jest z tego całkiem zadowolony, ale uważam, że brak powiązań GUI utrzyma mnie z Adą. – gour
Cóż, Ada nie jest tak naprawdę znana ze swoich wiązań graficznych. (Chociaż natknąłem się na to (http://people.cs.kuleuven.be/~dirk/ada-why2.html), co oznacza, że * są * niektóre dobre/łatwe w użyciu istniejące pakiety.) Ale , mam nadzieję, że będzie trochę pracy nad naprawianiem rzeczy i dobrem. otwarty, niezależny od platformy pakiet GUI będzie dostępny. (Nie uważam zwykłych wiązań za kwalifikacje.) – Shark8