2013-08-29 28 views
10

hôm nay tôi đã yêu cầu trong danh sách gửi thư D cho dù có thể xác định và sử dụng các loại dữ liệu tùy chỉnh theo cách tương tự như ví dụ: ví dụ từ trang wiki Ada:Các loại giống Ada ở 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); 

reply chứng minh một cái gì đó như:

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;}()); 
} 

trong đó cho thấy nó có thể, nhưng có lẽ nhớ tao nhã Ada.

Bây giờ, sau khi đọc về Nimrod gần đây, tôi tự hỏi làm thế nào nó có thể xử lý nhiệm vụ tương tự với quy định để đảm bảo cùng loại an toàn của Ada?

Trả lời

7

Nimrod hỗ trợ những thay trực tiếp:

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] 

lỗi được thực thi hoặc tại thời gian biên dịch:

var x: Day 
x = 40 # conversion from int literal(40) to Day is invalid 

.. hoặc tại thời gian chạy

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

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

Hơn nữa, distinct types có thể được sử dụng nếu yêu cầu an toàn loại mạnh hơn.

+0

Cảm ơn bạn. Araq cũng được đăng trên #ada, nơi chúng tôi đã thảo luận rất ít. Tôi đã không nhận thức được rằng Nimrod làm điều đó một cách tao nhã như Ada và khá hạnh phúc về nó, nhưng tôi tin rằng thiếu sự ràng buộc GUI sẽ giữ tôi với Ada. – gour

+0

Vâng, Ada không thực sự nổi tiếng về các ràng buộc đồ họa của nó. (Mặc dù tôi đã chạy qua [this] (http://people.cs.kuleuven.be/~dirk/ada-why2.html), cho biết * có * một số gói mở rộng tốt/dễ sử dụng.) Nhưng , hy vọng sẽ có một chút công việc để sửa chữa mọi thứ và một điều tốt. mở, nền tảng độc lập GUI-gói sẽ được sắp tới. (Tôi không xem xét các ràng buộc chỉ là đủ điều kiện.) – Shark8

0

Hơn nữa, instantiation trở thành một lập luận đơn giản sử dụng

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); 
    } 
} 

Xem Instantiator Function for Bound template doesn't compile