Strange Loop 2012

bearophile bearophileHUGS at lycos.com
Tue Oct 16 19:54:59 PDT 2012


> https://raw.github.com/psnively/types_vs_tests/master/src/main/scala/Shapeless.scala

If this is equivalent, then in D it was too much easy:


import std.typetuple: allSatisfy, staticIndexOf;

struct Digit(size_t N) { enum uint n = N; }
// No "static foreach", so:
alias Digit!0 _0;
alias Digit!1 _1;
alias Digit!2 _2;
alias Digit!3 _3;
alias Digit!4 _4;
alias Digit!5 _5;
alias Digit!6 _6;
alias Digit!7 _7;
alias Digit!8 _8;
alias Digit!9 _9;

template isDigit(alias T) {
     enum isDigit = staticIndexOf!(T, 
_0,_1,_2,_3,_4,_5,_6,_7,_8,_9) != -1;
}

bool isValid(Digits...)() {
     static if (Digits.length != 9 || !allSatisfy!(isDigit, 
Digits))
         return false;
     else {
         uint total = 0;
         /*static*/ foreach (i, Dig; Digits)
             total += (9 - i) * Dig.n;
         return total % 11 == 0;
     }
}

void main() {
     static assert(!isValid!(_0, _1)());
     static assert( isValid!(_3, _4, _5, _8, _8, _2, _8, _6, 
_5)());
     static assert( isValid!(_1, _2, _3, _4, _5, _6, _7, _8, 
_9)());
     static assert(!isValid!(_3, _1, _5, _8, _8, _2, _8, _6, 
_5)());
     static assert(!isValid!(_3, _4, _5, _8, _8, _2, _8, _6)());
}

Bye,
bearophile


More information about the Digitalmars-d mailing list