Nimrod中的类Ada类型

Nimrod中的类Ada类型,d,ada,nimrod,nim-lang,D,Ada,Nimrod,Nim Lang,今天,我在D邮件列表中询问是否可以以类似于Ada页面中的示例的方式定义和使用自定义数据类型: 而这个实验展示了一些类似的东西: 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 >

今天,我在D邮件列表中询问是否可以以类似于Ada页面中的示例的方式定义和使用自定义数据类型:

而这个实验展示了一些类似的东西:

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;}());
}
导入标准类型cons;
进口标准例外;
结构有限公司(T、T下部、T上部)
{
T_T,;
mixin Proxy!\u t;//有限充当t(几乎)
不变量()
{

强制(\u t>=lower&&u tNimrod直接支持这些:

type
  Day = range[1..31]
  Month = range[1..12]

  WeekDay = enum
    Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday

  WorkingDays = range[Monday..Friday]
  WorkingHours = range[0..12]

  WorkSchedule = array[WorkingDays, WorkingHours]
在编译时强制执行错误:

var x: Day
x = 40 # conversion from int literal(40) to Day is invalid
..或在运行时

var x: Day
var y = unknownInt() # let's say it returns 100

x = y # unhandled exception: value 100 out of range [EOutOfRange]

此外,如果需要更强的类型安全性,则可以使用。此外,使用

import std.traits;

/*! Instantiator for \c Limited. */
template limited(alias min, alias max, bool Exceptional = true)
    if (!is(CommonType!(typeof(min), typeof(max)) == void)) {
    auto limited(CommonType!(typeof(min), typeof(max)) value) {
        return Limited!(typeof(value), min, max)(value);
    }
}

请参见

谢谢。Araq也在《ada》上发表了文章,在那里我们很少讨论。我不知道Nimrod做得和ada一样优雅,也很高兴,但我相信缺少GUI绑定会让我继续使用ada。嗯,ada的图形绑定并不出名。(虽然我跑过去了,这表明有一些好的/易于使用的现存软件包)但是,希望在纠正事物方面会有一点工作,一个好的、开放的、平台无关的GUI包即将到来。(我不认为仅仅绑定是合格的。)
import std.traits;

/*! Instantiator for \c Limited. */
template limited(alias min, alias max, bool Exceptional = true)
    if (!is(CommonType!(typeof(min), typeof(max)) == void)) {
    auto limited(CommonType!(typeof(min), typeof(max)) value) {
        return Limited!(typeof(value), min, max)(value);
    }
}